您可能知道,VLA's haves pros and cons和它们在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的非指针类型成为可选的?
或者一件事暗示了另一件事?
(请原谅我糟糕的英语)
发布于 2018-11-18 09:40:13
保存指向可变可修改类型的指针需要一个实现来支持大约90%的VLA规范。其原因是有效的类型规则:
6.5表达式 6访问其存储值的对象的有效类型是该对象的声明类型(如果有的话)。如果值通过具有非字符类型的类型的lvalue存储到没有声明类型的对象中,则lvalue的类型成为该访问的对象的有效类型,对于不修改存储值的后续访问而言。如果值被复制到没有使用memcpy或memmove声明类型的对象中,或者被复制为字符类型的数组,则该访问和后续访问中未修改值的修改对象的有效类型是复制值的对象的有效类型(如果该对象有值的话)。对于没有声明类型的对象的所有其他访问,对象的有效类型只是用于访问的lvalue的类型。
在通过ptr访问malloced内存之后,对象的有效类型是VLA类型。因此,实现需要正确地支持这些语义。唯一可以“可选”的是能够声明具有自动存储期限的VLA.
int boo[n];..。这有点傻。如果一个实现支持动态分配对象的大多数VLA语义,那么它也可能允许将它们声明为具有自动存储持续时间的对象。委员会希望它是真正的可选的,所以这意味着指向VLA类型的指针也必须去做。
https://stackoverflow.com/questions/53359275
复制相似问题