你可能知道,VLA 的优点和缺点 https://stackoverflow.com/a/3082302/1606345在 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]));
在这种情况下,不存在炸毁堆栈的风险,而且在我看来它们非常有用。
我的问题是:
委员会是否可以保留指向 VLA 的指针,从而使指向非指针类型的 VLA 成为可选?
或者一件事暗示另一件事?
(原谅我糟糕的英语)
保留指向可变可修改类型的指针需要实现支持大约 90% 的 VLA 规范。原因是有效类型规则:
6.5 表达式
¶6 访问其存储值的对象的有效类型
是对象的声明类型(如果有)。如果一个值被存储到
没有通过左值声明类型的对象,其类型为
不是字符类型,则左值的类型变为
该访问和后续访问的对象的有效类型
不修改存储值的访问。如果复制一个值
使用 memcpy 或 memmove 进入没有声明类型的对象,或者是
复制为字符类型数组,然后是有效类型
该访问和后续访问的修改对象
不修改的值是对象的有效类型
如果有值,则复制该值。对于所有其他访问
没有声明类型的对象,该对象的有效类型是
只是用于访问的左值的类型。
通过访问后ptr
to the malloc
ed内存中,对象的有效类型是VLA类型。因此,实现需要正确支持这些语义。唯一可以保留为“可选”的是能够声明具有自动存储期限的 VLA...
int boo[n];
...这有点愚蠢。如果实现支持most动态分配对象的 VLA 语义,它也可能允许将它们声明为具有自动存储持续时间的对象。委员会希望它是真正可选的,因此这意味着指向 VLA 类型的指针也必须删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)