有人告诉我最小化C中数组的堆栈溢出,我可以通过从左右两侧填充数组来完成它,就像那样。但基本上我不明白。请解释,以便更好地理解。谢谢。
答案 0 :(得分:3)
堆栈是分配自动变量的地方
您可以通过分配大对象int x[10000000000]
或非常深层次的递归来溢出它。可以在多线程环境的每个线程的堆栈分配中进一步限制堆栈
避免在堆栈上分配的方法是使用malloc指定并在堆上进行分配(这是调用new的C版本),但这会增加代码复杂性,因为需要匹配调用free。
减少深度递归的方法是可能找到一个更浅(通常更有效)的递归算法。可能从两侧填充阵列导致较浅的递归。
然而,通常更好的方法是将递归算法转换为迭代(循环)等价物(通常也可以通过优化的递归来完成)。看一个微不足道的例子:以下递归:
unsigned mult(unsigned a, unsigned b)
{
return b ? a+mult(a, b-1) : 0;
}
成为以下迭代等价物:
unsigned mult(unsigned a, unsigned b)
{
unsigned ret=0;
while (b-- > 0)
ret+=a;
return ret;
}