2015-02-23 4 views
1

Можете ли вы объяснить мне, почему первый элемент из 2 размерного массива равен 1 в этом коде?Объяснение результата кода

#include <stdio.h> 
#include <stdlib.h> 
    int main(void) { 
     int i,j; 
     int **p = (int **)malloc(2 * sizeof(int *)); 
     p[0] = (int *)malloc(2 * sizeof(int)); 
     p[1] = p[0]; 
     for(i = 0; i < 2; i++) 
       for(j = 0; j < 2; j++){ 
        printf("i=%d & j=%d\t",i,j); 
        p[i][j] = i + j; 
        printf("p[%d][%d]=%d\n",i,j,p[i][j]); 
        printf("this is the result of the first element %d\n",p[0][0]); 
       } 


     printf("this is the result %d\n",p[0][0]); 
     return 0; 
    } 

В результате:

= 0 & J = 0 р [0] [0] = 0

это результат первого элемента 0

i = 0 & j = 1 p [0] [1] = 1

это результат первого элемента 0

= 1 & J = 0 р [1] [0] = 1

это результат первого элемента 1

= 1 & = 1 р [1] [1] = 2

это результат первого элемента 1

это результат 1

Нажмите, чтобы закрыть окно ...

+0

Вы намеревались 'p [0]' и 'p [1]' относиться к * той же * сингулярной строке? – WhozCraig

+0

Скорее всего, не связано с вашей проблемой, но [** не накладывает результат 'malloc()' **] (http://stackoverflow.com/a/605858/3488231). – ace

ответ

3

Потому что два ряда p[0] и p[1] действительно то же самое.

p представляет собой массив из двух указателей:

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

Первый из них указывает на массив размера 2:

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

второй указывает на тот же массив:

p[1] = p[0]; 

Таким образом, любая модификация p[1][0] будет отражена на p[0][0], поскольку оба относятся к одному и тому же месту в памяти. Как вы можете проверить, вы назначили 1 на p[1][0], так что p[0][0] также будет 1.

+0

Таким образом, p [1] = p [0]; это была ошибка, которая могла бы стать новым malloc, чтобы получить двумерный массив. Я полагаю, что – kyrpav

+0

да, точно @kyrpav. –

1

Я попытался объяснить на рисунке (извините за это, но его проще). enter image description here

Так, чтобы исправить свою ошибку и объявить правильную матрицу 2-D, вместо таНос для р [0] написать for(int i=0; i < 2;i++)p[i] = (int *)malloc(2*sizeof(int));.

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