2013-08-30 3 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

компилируется без предупреждения

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

возможно, но он выделяет неправильный размер –

+0

Какой компилятор вернет другой размер для void *, чем int **? – stark

+0

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

3

Вы получаете предупреждения, потому что p является int **, и вы выделяете память, как если бы это было int * в ваших линиях if..else. Просто заменить строки следующим образом:

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

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

Вы получаете предупреждения, потому что вы (а) смазывают возвращаемое значение malloc() и realloc(), и (б), отбрасывая его на неправильный тип. В C обычно считается, что лучше всего не возвращать возвращаемое значение malloc() и realloc(), потому что void* автоматически преобразует в любой другой тип указателя, а при вводе ненужного приведения может привести к ошибкам (например, вашим, например).

Смежные вопросы