Как компилятор узнает об измерениях массива, если нет гарантии в последовательности оценки параметров - PullRequest
6 голосов
/ 03 мая 2019

Мой код:

//fun FUNCTION
void fun(int D1, int D2, int arr[D1][D2]) 
{
    //FUNCTION BODY
}


//MAIN FUNCTION

int D1, D2;
int arr[][3]=//VALUES
D2=sizeof(arr[0])/sizeof(a[0][0]);
D1=sizeof(arr)/sizeof(a[0]);

fun(D1,D2,arr);

Как бы компилятор узнал размеры массива arr в функции fun , если порядок параметров функции не определен?

1 Ответ

3 голосов
/ 03 мая 2019

Стандарт C не определяет порядок оценки аргументов.Однако все аргументы оцениваются перед вызовом функции.Согласно C 2018 6.5.2.2 10 (где рассматриваются вызовы функций):

Существует точка последовательности после вычислений указателя функции и фактических аргументов, но до фактического вызова.

Таким образом, когда начинается выполнение вызываемой функции, все аргументы оцениваются, поэтому их значения известны.Затем выражения размера изменяемых параметров оцениваются в соответствии с 6.9.1 10 (в котором обсуждаются определения функций):

При входе в функцию оцениваются выражения размера каждого изменяемого параметра иЗначение каждого выражения аргумента преобразуется в тип соответствующего параметра, как если бы это было сделано с помощью присваивания.

(Обратите внимание, что аргументы - это то, что вызывающий объект передает функции, а параметры - это объекты, объявленные как частьобъявление или определение функции, которые получают значения при входе в функцию.)

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