gpt4 book ai didi

c - 指向 VLA 的指针

转载 作者:行者123 更新时间:2023-12-04 11:49:41 25 4
gpt4 key购买 nike

您可能知道,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]));

在这种情况下,没有炸毁堆栈的风险,而且 IMO 它们非常有用。

我的问题是:

委员会能否保留指向 VLA 的指针,使 VLA 指向非指针类型是可选的?

还是一件事暗示另一件事?

(原谅我可怜的英语)

最佳答案

保留指向可变可修改类型的指针需要一个实现来支持大约 90% 的 VLA 规范。原因是有效类型规则:

6.5 Expressions

¶6 The effective type of an object for an access to its stored value is the declared type of the object, if any. If a value is stored into an object having no declared type through an lvalue having a type that is not a character type, then the type of the lvalue becomes the effective type of the object for that access and for subsequent accesses that do not modify the stored value. If a value is copied into an object having no declared type using memcpy or memmove, or is copied as an array of character type, then the effective type of the modified object for that access and for subsequent accesses that do not modify the value is the effective type of the object from which the value is copied, if it has one. For all other accesses to an object having no declared type, the effective type of the object is simply the type of the lvalue used for the access.



通过 ptr 访问 malloc ed 内存后,对象的有效类型是 VLA 类型。因此,实现将需要正确支持这些语义。唯一可以保留“可选”的是能够声明具有自动存储持续时间的 VLA ......
int boo[n];

……这有点傻。如果一个实现支持动态分配对象的大部分 VLA 语义,它也可以允许将它们声明为具有自动存储持续时间的对象。委员会希望它真正是可选的,所以这意味着指向 VLA 类型的指针也必须去。

关于c - 指向 VLA 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53359275/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com