int []f() {
int a[1] = {5};
return a;
} // a's value doesn't exist. WHY?
Во-первых, компилятор не будет знать, какой размер массива возвращать. Я только что получил синтаксические ошибки, когда использовал ваш код, но с помощью typedef я смог получить ошибку, которая гласила, что функции не могут возвращать массивы, которые я знал.
typedef int ia[1];
ia h(void) {
ia a = 5;
return a;
}
Во-вторых, ты все равно не сможешь этого сделать. Вы также не можете сделать
int a[1] = {4};
int b[1];
b = a; // Here both a and b are interpreted as pointer literals or pointer arithmatic
Хотя вы не пишете это так, и компилятору на самом деле даже не нужно было бы генерировать для него какой-либо код, эта операция должна была бы выполняться семантически, чтобы это было возможно, чтобы можно было использовать новое имя переменной для ссылки на значение, которое было возвращено функцией. Если вы вложите его в структуру, то компилятор будет в порядке с копированием данных.
Кроме того, вне объявлений и операторов sizeof (и, возможно, операций typeof, если у компилятора есть такое расширение) всякий раз, когда имя массива появляется в коде, оно рассматривается компилятором как литерал указателя или как часть арифметики указателя это приводит к указателю. Это означает, что оператор return будет выглядеть так, как будто вы возвращаете неправильный тип - указатель, а не массив.
Если вы хотите знать, почему это невозможно, просто нельзя. Компилятор может неявно думать о массиве, как если бы он был в структуре, и заставить его произойти, но это не то, как в стандарте C говорится, что это должно быть сделано.