根据某人在另一个线程中的评论:
VLA 带来的问题比它们解决的问题还要多,因为你永远不知道
如果声明会因为 x 太大而崩溃
堆。
这段代码会溢出,因为sizeof(a)
对于堆栈来说太长:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 100000000;
int a[4][n];
printf("%zu\n", sizeof(a));
return 0;
}
但这一个不能因为sizeof(a)
是 8(我电脑中指针的大小):
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
int n = 100000000;
int (*a)[n];
printf("%zu\n", sizeof(a));
a = malloc(sizeof(*a) * 4);
free(a);
return 0;
}
我的假设正确吗?
我们能否根据以下情况确定 VLA 的使用是否危险(可能溢出):sizeof
物体?
int (*a)[n];
不是VLA,而是指向VLA的指针。所以 OP 2 的例子还不够接近。
As @M.M评论说,防止堆栈溢出是任何自动分配的一个问题。递归可能会过度消耗堆栈。局部大变量也会过度消耗堆栈。
VLA 只是最有可能被过度使用的一种。
// Qualified use of VLA
int len = snprintf(NULL, 0 "%d", some_int);
assert(len > 0);
char vla_good[len+1];
len = snprintf(vla_good, len+1, "%d", some_int);
// Unqualified
int x;
scanf("%d", &x);
char vla_bad[x]; // who knowns what x may be, did scanf() even work?
VLA 引入的问题比它们解决的问题还要多,因为您永远不知道声明是否会因为 x 对于堆栈来说太大而崩溃。
我们能否确定使用 VLA 是否危险?
使用正确的工具来完成任务。通常,最坏情况下的小型固定大小数组就可以了。 VLA 的用途有限。健壮的代码将确保在声明 VLA 之前数组元素计数不是愚蠢的。
请注意,自 C99 起可用的 VLA 在 C11 中也可选择支持。
VLA 还不错,他们是就这样画的.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)