2014-02-05 3 views
0

Следующая программа печатает 9 вместо 17, почему?C преобразование 2D-массива в двойной указатель печатает неожиданное значение

int main() 
{ 
    int **ptr; 
    int i=0, j=0; 
    int arr[2][2]={{17,9},{7,19}}; 

    ptr=(int**)arr; 
    printf("%d\n", ptr[0]); 
    return 0; 
} 
+3

Это неопределенное поведение. – Simple

+0

Dinesh почему вы печатаете ptr [0]? Вы хотите напечатать ptr [0] [0]? – HAL9000

+0

Вы имеете в виду 'int * ptr'? – Jarod42

ответ

8

Массив массивов не такой же, как указатель на указатель.

Причина в том, что макет памяти полностью отличается.

Для массива массивов:

 
+-----------+-----------+-----------+-----------+ 
| arr[0][0] | arr[0][1] | arr[1][0] | arr[1][1] | 
+-----------+-----------+-----------+-----------+ 

Для указатель на указатель:

 
+--------+--------+-----+ 
| arr[0] | arr[1] | ... | 
+--------+--------+-----+ 
    |  | 
    |  V 
    |  +-----------+-----------+-----+ 
    |  | arr[1][0] | arr[1][1] | ... | 
    |  +-----------+-----------+-----+ 
    V 
+-----------+-----------+-----+ 
| arr[0][0] | arr[0][1] | ... | 
+-----------+-----------+-----+ 

Как массивов распадается на указатель, вы можете иметь указатель на массивы, хотя:

int (*ptr)[2] = arr; 
+0

Вау! Приятно видеть в 100k + :). Конго! – haccks

+0

@hacces Спасибо! :) –

1

Причиной такого поведения является ваша программа вызывает неопределенное поведение. Вы используете спецификатор %d для печати типа указателя. Использование неверного спецификатора формата вызывает UB.
Обратите внимание, что указатель на объект типа указателя не является двумерным массивом. Массивы не являются указателями, хотя имена массивов распадается на указатель на его первый элемент.

+0

Точно. Не говоря уже о том, что 2D-массив не является двойным указателем. –

+0

@ H2CO3; Совершено :) – haccks

0

Указатель на указатель определен лишен смысла при назначении 2-мерным массивом. Используйте указатель на массив, как показано ниже, который полезен при доступе к массиву массивов.

int main() 
{ 
    int (*ptr)[2]; // ptr is pointer to array of 2 ints 
    int arr[2][2]={{17,9},{7,19}}; 
    ptr = arr; 
    printf("%d\n", (*ptr)[0]); 
    return 0; 
} 
Смежные вопросы