Dav*_*eri 8 c variable-length-array
您可能知道,VLA 有优点也有缺点,并且在 C11 中它们是可选的。
我认为使 VLA 成为可选的主要原因是:“堆栈可能会爆炸”:
int arr[n]; /* where n = 1024 * 1024 * 1024 */
Run Code Online (Sandbox Code Playgroud)
但是指向 VLA 的指针又如何呢?
int m, n;
scanf("%d %d", &m, &n);
int (*ptr)[n] = malloc(sizeof(int [m][n]));
Run Code Online (Sandbox Code Playgroud)
在这种情况下,不存在炸毁堆栈的风险,而且在我看来它们非常有用。
我的问题是:
委员会是否可以保留指向 VLA 的指针,从而使指向非指针类型的 VLA 成为可选?
或者一件事暗示另一件事?
(原谅我糟糕的英语)
保留指向可变可修改类型的指针需要实现支持大约 90% 的 VLA 规范。原因是有效类型规则:
\n\n\n\n\n6.5 表达式
\n\n\xc2\xb66 访问其存储值的对象的有效类型\n 是该对象的声明类型(如果有)。如果通过类型不是字符类型的左值将值存储到没有声明类型的对象中,则该左值的类型将成为该访问和后续访问的对象的有效类型\n 不修改存储值的访问。如果使用 memcpy 或 memmove 将值复制到没有声明类型的对象,或者复制为字符类型数组,则该访问和后续访问的修改对象的有效类型\n 不修改值是从中复制值的对象的有效类型(如果有)。对于对没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的左值的类型。
\n
在访问via ed内存后ptr,malloc对象的有效类型是VLA类型。因此,实现需要正确支持这些语义。唯一可以保留为“可选”的是能够声明具有自动存储持续时间的 VLA...
int boo[n];\nRun Code Online (Sandbox Code Playgroud)\n\n...这有点愚蠢。如果一个实现支持动态分配对象的大部分VLA 语义,那么它也可能允许将它们声明为具有自动存储持续时间的对象。委员会希望它是真正可选的,因此这意味着指向 VLA 类型的指针也必须删除。
\n