0

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

然后崩溃。如果我替换520721520720我得到:

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做,甚至不接触指针或它指向的数据。

我只是想知道我的机器到底发生了什么……为什么这段代码会导致崩溃?

非常感谢您的洞察力!

4

1 回答 1

2

它崩溃是因为您导致堆栈溢出。那个巨大的数组是在栈上分配的,栈并没有那么大。

简单地分配一个变量就足以使它移动堆栈指针。您不写入它,但是当您随后调用其他函数时,您的程序会尝试写入堆栈,经过巨大的数组,以分配下一个堆栈帧。这是它崩溃的时候。

您已经有了解决方案:改用动态分配。

于 2013-09-07T00:47:25.350 回答