Доступ к 2D массиву в C, но без индекса столбца

#arrays #c #indexing #compiler-errors #garbage

Вопрос:

если у меня есть 2D массив

int A[3][2] = { {3,4}, {5,6}, {0,-5} }

каков будет результат, если я попытаюсь распечатать элемент A[1]? будет ли это мусорная ценность? или это станет логической ошибкой?

Комментарии:

1. Технически C не имеет многомерного массива. То, что у вас есть A , — это массив массивов int . Так A[1] же как и массив (из двух int значений). Если компилятор будет жаловаться или это логическая ошибка, зависит от контекста, что вы делаете с массивом.

2. итак, если я попытаюсь вывести значение A[1], каков будет результат? мусор?

3. @Someprogrammerdude, технически C не имеет отрицательных чисел, а только унарный минус , за которым следует числовой литерал

4. @TerryTan, это зависит от того, как вы попытаетесь это напечатать. Существуют способы, которые привели бы к совершенно достоверным, четко определенным результатам, и способы, которые привели бы к неопределенному поведению.

5. Обратите также внимание, что программа, создающая неопределенное поведение, не обязательно означает, что она выдаст результат, который вы распознали бы как «мусор».

Ответ №1:

Предполагая, что вы сделаете что-то вроде

 printf("%dn", A[1]);  

тогда это будет неопределенное поведение. Это связано с тем, что массив A[1] распадется до указателя на его первый элемент (т. Е. В этом контексте A[1] распадется до amp;A[1][0] ), а спецификатор %d формата неверен для печати указателей.

Однако

 printf("%pn", (void *) A[1]);  

будет прекрасно, как %p и правильный спецификатор формата для печати void * указателей.


И, как отмечено в комментарии, только потому, что у вас неопределенное поведение, это не означает, что программа выйдет из строя или приведет к «мусору» (даже если (возможно, усеченный) указатель может выглядеть так при печати в виде десятичного целого числа).