C 堆叠粉碎,甚至不访问任何数据
在我的机器上,下面的代码显然会产生stacksmashing:C 堆叠粉碎,甚至不访问任何数据,c,local-variables,stack-smash,C,Local Variables,Stack Smash,在我的机器上,下面的代码显然会产生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() {
#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
替换为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
s之外什么都不做,甚至不触及指针或它所指向的数据
我只是想知道我的机器到底发生了什么…为什么这个代码会导致崩溃
非常感谢您的洞察力 它正在崩溃,因为您正在导致堆栈溢出。这个巨大的数组被分配到堆栈上,而堆栈并没有那么大
简单地分配一个变量就足以使它移动堆栈指针。您不向它写入,但当您调用其他函数时,您的程序会尝试写入堆栈,超过巨大的数组,以分配下一个堆栈帧。这是它崩溃的时候
您已经找到了解决方案:改用动态分配。是的,但是为什么……我没有向int表写入任何内容!它存在这一简单事实仍然会移动堆栈指针。这意味着,即使数组的大小事先已知并已固定,您仍然需要遵守限制?是的。您仍然需要考虑堆栈大小。在Windows上,默认堆栈大小为1MB。堆栈溢出是打破该限制的结果,因为嵌套了太多的调用,或者试图使用太多的堆栈空间,或者两者兼而有之。对于较大的分配,您需要使用动态分配。我不知道这一点。我认为在编译静态可执行文件时,内存中所需的大小会以某种方式通知操作系统。我不知道Windows上的1MB限制,我认为只有当一个函数有意在某个数组外写入时才会发生堆栈崩溃。你教了我一些东西!谢谢
main_checkpoint1
function1_checkpoint1
grps one more line
main_checkpoint2