0

次のコードで警告が表示される理由がわかりません。

#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;
}  

ダブルポインタにメモリを動的に割り当てる方法は他にありますか?

4

3 に答える 3

3

int **p が anであり、あたかも行内の an であるかのようにメモリを割り当てているため、警告が表示さint *れますif..else。次のように行を置き換えるだけです。

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

p=(int **)realloc(p,(i+1)*sizeof(int *));
于 2013-08-30T02:27:14.710 に答える
0

これは警告なしでコンパイルされます

  int **p;
  p = (int **) malloc(sizeof(void *));
于 2013-08-30T02:29:36.213 に答える
0

malloc()(a) andの戻り値をキャストしrealloc()、(b)間違った typeにキャストしているため、警告が表示されます。malloc()C では、通常、 andの戻り値をキャストしないことが最善であると考えられていますrealloc()。これは、void*自動的に他のポインター型に変換され、不要なキャストを入れるとエラー (たとえば、あなたのものなど) が発生する可能性があるためです。

于 2013-08-30T03:08:05.630 に答える