#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 *
указателей.
И, как отмечено в комментарии, только потому, что у вас неопределенное поведение, это не означает, что программа выйдет из строя или приведет к «мусору» (даже если (возможно, усеченный) указатель может выглядеть так при печати в виде десятичного целого числа).