Unexpected c pointer result -


hi have started learning c pointers , can't understand why getting different pointer value expected. here function

int test(void){     int i,j;      int **p = (int **)malloc(2 * sizeof(int *));      p[0] = (int *)malloc(2 * sizeof(int));      printf("p[0] = %d\n",p[0]);     p[1] = p[0];      printf("p[1] = %d\n",p[1]);     for(i = 0; < 2; i++){              for(j = 0; j < 2; j++) {                     p[i][j] = + j;                     printf("p[%d][%d] = %d\n",i,j,p[i][j]);             }     }      printf("result p[0][0] = %d\n",p[0][0]);   return 0; } 

i expecting p[0][0] = 0 printed loop, equal 1 , value seems coming p[1][0], missing here?

printf output:

p[0] = 1224416 p[1] = 1224416 p[0][0] = 0 p[0][1] = 1 p[1][0] = 1 p[1][1] = 2 result p[0][0] = 1 

first -- passing int* printf(), expects int (%d) , use (%p) printing address instead.


second --

p[1] = p[0]; 

the p[0] , p[1] pointers both pointing same address. means if modify 1 row (p[0]), second (p[1]) modified well.

and root of problem

i expecting p[0][0] = 0 printed loop, equal 1 , value seems coming p1[0], missing here?

+---+---+ | 0 | 0 | +---+---+  ^ ^  | |  | -------------------- p[0]  ---------------------- p[1] 

now modify p[1], , looks this. in other words, values 0 , 1 of p[0] overwritten

+---+---+ | 1 | 2 | +---+---+  ^ ^  | |  | -------------------- p[0]  ---------------------- p[1] 

instead of p[1] = p[0], assign p[1] (different) memory on heap well.

p[0] = malloc(2 * sizeof(int));  p[1] = malloc(2 * sizeof(int)); 

and p[0][0] correctly 0.


third -- recasting malloc redundant , may lead problems. do cast malloc return value?


in c++ can(should) use built in operators new , delete.

also dont forget free() allocated memory on heap.


Comments

Popular posts from this blog

Is there a better way to structure post methods in Class Based Views -

performance - Why is XCHG reg, reg a 3 micro-op instruction on modern Intel architectures? -

jquery - Responsive Navbar with Sub Navbar -