【发布时间】:2014-09-18 19:45:07
【问题描述】:
我为可能的重复道歉(无法找到答案):
是否需要确保变长数组的分配成功完成?
例如:
void func(int size)
{
int arr[size];
if (arr == NULL)
{
// Exit with a failure
}
else
{
// Continue as planned
}
}
答案似乎很明显是,但arr == NULL的语法感觉有点不寻常。
谢谢
更新:
我承认我还不确定上面的代码是否可以编译(假设可以编译)。
如果不编译,则表示无法断言变长数组的分配。
因此,我假设如果分配失败,那么程序会立即崩溃。
这将是一个非常尴尬的情况,因为程序在非法内存访问(读取或写入)后崩溃是有意义的,而不是在内存分配不成功后崩溃。
或者也许分配不会导致任何事情,但是一旦我在“落在”堆栈之外的条目处访问数组,我可能会遇到内存访问冲突(如堆栈溢出)......?
说实话,如果 VLA 后面有更多的局部变量(尤其是其他 VLA),我什至看不到 VLA 是如何在堆栈上分配的,所以我也希望能就这个问题得到解答。
【问题讨论】:
-
局部变量在栈上分配。如果它不能分配它,程序可能会在你测试之前崩溃。
-
@Barmar:根据我在 VLA 上阅读的内容,该标准没有定义它们是在堆栈上分配还是在堆上分配。如果“那个东西”确实立即崩溃了,那么它就会使这种机制变得毫无用处。
-
你说得对,标准并没有强制要求。但我希望这是大多数实现的方式。本地数组永远不能是
NULL。 -
@Deduplicator:这不是让 VLA 在所有可能的情况下都毫无用处吗?
-
编译器魔法,还有什么?早期的 x86(可能是其他的)大多数时候除了堆栈指针之外还使用帧指针。如今,它尽可能地被省略了......所以,编译器可能会在那里恢复这个概念......
标签: c c99 variable-length-array