在我的机器上,以下代码显然会产生 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);
如您所见,我所做的只是调用 in 中的第一个函数main
,它创建一个非常大的本地int
表,然后将指向该int
表的指针传递给第二个函数。第二个函数除了 s 什么都不printf
做,甚至不接触指针或它指向的数据。
我只是想知道我的机器到底发生了什么……为什么这段代码会导致崩溃?
非常感谢您的洞察力!