2013-08-30 36 views
0

我不知道爲什麼我得到以下代碼的警告。c中的雙指針,我的代碼的賦值警告

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

是否有任何其他方式爲雙指針動態分配內存。

+1

你能顯示警告信息嗎? – krsteeve

+0

@Sashank,你想用這個代碼做什麼? –

+0

爲什麼你使用'p'的動態分配開始?爲什麼不'int * p [5];'? –

回答

0

這將編譯沒有警告

​​
+0

也許,但它分配錯誤的大小 –

+0

什麼編譯器會返回一個void *比int **不同的大小? – stark

+0

http://stackoverflow.com/questions/15832631/can-pointers-be-of-different-sizes –

3

您會收到警告,因爲p是int **並且您正在分配內存,就好像它是if..else行中的int *一樣。只需按照以下步驟更換您的線路:

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

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

你得到警告,因爲你是(一)鑄造的malloc()realloc(),和(b返回值)將它鑄造成錯誤類型。在C中,通常認爲最好不要投入malloc()realloc()的返回值,因爲void*會自動轉換爲任何其他指針類型,並且放入不必要的轉換會導致錯誤(例如您的錯誤)。