gpt4 book ai didi

c++ - 局部变量的堆栈溢出?

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:37 27 4
gpt4 key购买 nike

首先让我说我的问题不是关于堆栈溢出,而是如何让它发生,没有编译时错误\警告。我知道(第一手资料)你可以用递归溢出堆栈:

void endlessRecursion()
{
int x = 1;
if(x) endlessRecursion(); //the 'if' is just to hush the compiler
}

我的问题是,是否有可能通过声明过多的局部变量来溢出堆栈。显而易见的方法就是像这样声明一个巨大的数组:

void myStackOverflow()
{
char maxedArrSize[0x3FFFFFFF]; // < 1GB, compiler didn't yell
}

实际上,即使是 0xFFFFFF 字节也会导致我的机器发生堆栈溢出

所以,我想知道:

  1. 因为我还没有尝试过,如果我声明了足够多的变量,堆栈溢出?
  2. 有没有办法使用预处理器或其他编译时“工具”(如 C++ template meta-programming )做第一件事,即通过某种方式使其循环来声明大量局部变量?如果是,怎么做?
  3. 这是理论上的——有没有办法知道程序的堆栈是否会在编译时溢出?如果是,请解释。

最佳答案

是的,分配大量内存会导致堆栈溢出。分配一个大变量还是分配许多小变量并不重要;总大小是相关的。

您不能使用预处理器执行编译时循环,但您可以实现一些快捷方式,让您无需全部键入即可生成大量代码。例如:

#define DECLARE1 { int i;
#define END1 }

#define DECLARE2 DECLARE1 DECLARE1
#define END2 END1 END1

#define DECLARE4 DECLARE2 DECLARE2
#define END4 END2 END2

等等。这将多个 int i; 声明放在嵌套 block 中,确保所有对象同时存在,同时避免名称冲突。 (我想不出一种方法来为所有变量赋予不同的名称。)

DECLARE4 END4

扩展为:

{ int i; { int i; { int i; { int i; } } } }

如果您的编译器在预处理后对一行的长度施加限制,这将不起作用。

这里的教训是预处理器并不是真正为这种事情设计的。用您最喜欢的生成声明的脚本语言编写程序要容易得多,也更灵活。例如,在 bash 中:

for i in {1..100} ; do
echo " int i$i;"
done

关于c++ - 局部变量的堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23140707/

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