【问题标题】:Double pointer in c, assignment warning for my codec中的双指针,我的代码的赋值警告
【发布时间】:2013-08-30 02:12:19
【问题描述】:

我不知道为什么我收到以下代码的警告。

#include<stdio.h>
#include<malloc.h>
int main()
{
    int **p;
    int i,j;
    for(i=0;i<5;i++)
    {
        if(i==0)
            p=(int*)malloc(1*sizeof(int));
        else
            p=(int*)realloc(p,(i+1)*sizeof(int));
        p[i]=(int*)malloc(5*sizeof(int));

        for(j=0;j<5;j++)
        {
           p[i][j]=j;
        }
    }
    for(i=0;i<5;i++)
    {
        for(j=0;j<5;j++)
            printf("%5d",p[i][j]);
        printf("\n");
    }

    return 0;
}  

有没有其他方法可以为双指针动态分配内存。

【问题讨论】:

  • 你能显示警告信息吗?
  • @Sashank,你想用这段代码做什么?
  • 你为什么要使用动态分配p开始?为什么不int *p[5];
  • @EricZ 我正在尝试通过将值插入通过动态分配内存创建的二维数组来实现演示程序。
  • @BenVoigt,我正在尝试使用双指针,为什么要使用双指针,因为您指定 int *p[5] 的片段您必须指定一个值,即行数,如果您不知道要创建多少行。

标签: c dynamic-memory-allocation double-pointer


【解决方案1】:

您会收到警告,因为 p 是 int ** 并且您正在分配内存,就好像它是 int * 在您的 if..else 行中一样。只需按如下方式替换您的行:

p=(int **)malloc(1*sizeof(int *));

p=(int **)realloc(p,(i+1)*sizeof(int *));

【讨论】:

    【解决方案2】:

    编译时没有警告

      int **p;
      p = (int **) malloc(sizeof(void *));
    

    【讨论】:

    • 什么编译器会为 void* 返回与 int** 不同的大小?
    • 这些例子是 C++
    • 所以? C++ 对原始类型提供与 C 相同的保证。决定指针大小的是平台,而不是语言。 (欢迎您从 C 标准中提取一条另有规定的规则……但我认为不存在)
    • 刚刚检查了 C 标准。第 6.2.5/26 节是相关规则,并明确指出 void* 不必与除 char* 之外的任何其他指针大小相同。
    • malloc 返回一个无类型的 void * 并将其转换为所需的指针类型。这将如何使用不同的指针大小?
    【解决方案3】:

    您收到警告是因为 (a) 转换了 malloc()realloc() 的返回值,并且 (b) 将其转换为 错误的类型。在 C 中,通常认为最好不要转换 malloc()realloc() 的返回值,因为 void* 会自动转换为任何其他指针类型,并且放入不必要的转换可能会导致错误(比如你的,例如)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-21
      • 2017-08-20
      • 2016-12-23
      • 2012-05-09
      • 2021-01-13
      • 2011-09-01
      • 2011-06-30
      相关资源
      最近更新 更多