在我的机器上,以下代码显然会产生stacksmashing:
#include <stdio.h>
#include <stdlib.h>
void function2(int* data);
void function1();
void function2(int* data)
{
printf("grps ");
printf(" ");
printf(" one more line\n");
}
void function1()
{
printf("function1_checkpoint1\n");
int *tempData[520721];
function2(tempData);
}
int main()
{
printf("main_checkpoint1\n");
function1();
printf("main_checkpoint2\n");
return 0;
}
如果它没有在您的计算机上崩溃,请尝试将一些更为疯狂的数字替换为520721
,例如1000万。我的输出是:
main_checkpoint1
然后崩溃。如果我将520721
替换为520720
,我会:
main_checkpoint1
function1_checkpoint1
然后也崩溃了。如果我将printf(" ")
替换为printf("")
(禁止空格,打印空字符串),程序正常运行并且我得到了
main_checkpoint1
function1_checkpoint1
grps one more line
main_checkpoint2
最后,将int *tempData[520721];
替换为int *tempData=malloc(520721*sizeof(int));
,然后对malloc()
的成功进行测试并使用free(tempData);
,这一直在我测试过的所有案例中都有效。
正如您所看到的,我正在做的是调用main
中的第一个函数,它创建一个非常大的本地int
表,然后将指针传递给此int
表,到第二个功能。除了printf
之外,第二个函数什么也不做,甚至不触及指针或它指向的数据。
我只是想知道我的机器到底发生了什么...为什么这段代码会导致崩溃?
非常感谢您的见解!
答案 0 :(得分:2)
它崩溃了,因为你造成了堆栈溢出。这个巨大的数组在堆栈上分配,堆栈不是 大。
只需分配一个变量足以让它移动堆栈指针。你没有写它,但是当你调用你的其他函数时,你的程序会尝试写入堆栈,过去巨大的数组,以分配下一个堆栈帧。这是它崩溃的时候。
您已经有了解决方案:改为使用动态分配。