как объявление массива в качестве аргумента не требует границы для 1-го измерения? - PullRequest
1 голос
/ 10 июля 2019

В C невозможно объявить 2D-массив в качестве аргумента, не ограничивая второе измерение, в то время как первое измерение не может иметь границ. Мне было интересно, как компилятор отслеживает длину первого измерения и почему он не делает то же самое для дальнейших измерений?

Поскольку компиляция следующего кода не будет работать:

int func(int array[][]) {
  return 0;
}

и даст

error: declaration of ‘array’ as multidimensional array must have bounds for all dimensions except the first

1 Ответ

2 голосов
/ 11 июля 2019

Как правило, компилятор не отслеживает первое измерение аргумента / параметра массива.(Если это так, то это расширение того, что требует стандарт C, возможно, как часть функции, обеспечивающей проверку границ.) Фактически невозможно передать массив в качестве аргумента в C, и для подпрограммы невозможнообъявить массив как параметр.

Когда параметр функции объявляется как массив, он автоматически настраивается в качестве указателя, согласно C 2018 6.7.6.3 7:

Aобъявление параметра как «массива тип » должно быть скорректировано на «квалифицированный указатель на тип », где квалификаторы типа (если таковые имеются) - те, которые указаны в [ и] деривации типа массива…

Когда массив задается в качестве аргумента функции, он автоматически преобразуется в указатель на свой первый элемент, согласно C 2018 6.3.2.1 3:

За исключением случаев, когда это операнд оператора sizeof или унарный оператор &, или строковый литерал, используемый для инициализации массива, выражение с типом "массив" тип"преобразуется в выражение с типом" указатель на тип", которое указывает на начальный элемент объекта массива…

Таким образом, массивникогда не передается в качестве аргумента и не принимается в качестве параметра.Передаются только указатели.

Реализации C никогда не требуется длина массива для обеспечения какого-либо стандартного поведения C.Предположим, например, что параметр объявлен как int x[3][4].Это автоматически настраивается на int (*x)[4].Затем, если код в функции использует x[i][j], реализация C должна найти этот элемент в памяти.Это i*4+j элементов за пределами x точек.Реализация нуждается во втором измерении, чтобы выполнить вычисление, потому что оно должно увеличиваться на i подмассивов, чтобы найти элемент x[i][j].Так как он увеличивается на подмассивы, ему нужно знать, насколько велики подмассивы.

Однако реализация C не должна знать, насколько велик массив.Никакое выражение не потребует от него использования размера массива.Поэтому достаточно иметь указатель на первый элемент массива.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...