gpt4 book ai didi

c - 大 VLA 溢出

转载 作者:太空狗 更新时间:2023-10-29 16:10:39 26 4
gpt4 key购买 nike

基于另一个线程中某人的评论:

VLAs introduce more problems than they solve, because you never know if the declaration is going to crash for x being too large for the stack.

这段代码会溢出,因为 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;
}

我的假设是否正确?

我们能否根据对象的 sizeof 来确定使用 VLA 是否危险(可能溢出)?

最佳答案

int (*a)[n]; 不是VLA,而是指向VLA的指针。所以 OP 2 的例子不是一个足够接近的比较。


作为@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?

VLAs introduce more problems than they solve, because you never know if the declaration is going to crash for x being too large for the stack.

Can we determine if the use of a VLA is dangerous?

为任务使用正确的工具。通常最坏情况下的小型固定大小数组就可以了。 VLA 的用途有限。在声明 VLA 之前,健壮的代码将确保数组元素计数不是愚蠢的。

请注意,自 C99 以来可用的 VLA 在 C11 中是可选支持的。

VLA 还不错,它们是 just drawn that way .

关于c - 大 VLA 溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42123355/

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