Указатели на VLA - PullRequest
       10

Указатели на VLA

0 голосов
/ 18 ноября 2018

Как вы, наверное, знаете, у VLA есть плюсы и минусы , и они необязательны в C11.

Я полагаю, что основная причина сделать VLA необязательной: «стек может взорваться»:

int arr[n]; /* where n = 1024 * 1024 * 1024 */

а как насчет указателя на VLA?

int m, n;

scanf("%d %d", &m, &n);

int (*ptr)[n] = malloc(sizeof(int [m][n]));

В этом случае нет риска взорвать стек, и IMO они чрезвычайно полезны.

Мой вопрос:

Может ли комитет сохранить указатели на VLA, делая необязательные типы VLA на необязательные?

Или одно подразумевает другое?

(Извините, мой плохой английский)

1 Ответ

0 голосов
/ 18 ноября 2018

Сохранение указателей на переменно изменяемые типы потребует реализации, поддерживающей около 90% спецификации VLA. Причиной является действующее правило типа:

6,5 Выражения

¶6 Действительный тип объекта для доступа к его сохраненному значению является объявленным типом объекта, если таковой имеется. Если значение хранится в объект, не имеющий объявленного типа через lvalue, имеющий тип, который не является символьным типом, тогда тип lvalue становится эффективный тип объекта для этого доступа и для последующего доступы, которые не изменяют сохраненное значение. Если значение копируется в объект, не имеющий объявленного типа, используя memcpy или memmove, или копируется как массив символьного типа, затем эффективный тип измененный объект для этого доступа и для последующих обращений, которые делают не изменять значение - это эффективный тип объекта, из которого значение копируется, если оно есть. Для всех других доступов к объект не имеет объявленного типа, эффективный тип объекта просто тип lvalue, используемого для доступа.

После доступа через ptr к редактируемой памяти malloc эффективный тип объекта - тип VLA. Поэтому реализация должна будет правильно поддерживать эту семантику. Единственное, что можно оставить «необязательным», - это возможность объявлять VLA с автоматической продолжительностью хранения ...

int boo[n];

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

...