Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 堆叠粉碎,甚至不访问任何数据_C_Local Variables_Stack Smash - Fatal编程技术网

C 堆叠粉碎,甚至不访问任何数据

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() {

在我的机器上,下面的代码显然会产生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
替换为
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