Stacksmashing甚至没有访问任何数据

时间:2013-09-07 00:45:23

标签: 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()
{
    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之外,第二个函数什么也不做,甚至不触及指针或它指向的数据。

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

非常感谢您的见解!

1 个答案:

答案 0 :(得分:2)

它崩溃了,因为你造成了堆栈溢出。这个巨大的数组在堆栈上分配,堆栈不是 大。

只需分配一个变量足以让它移动堆栈指针。你没有写它,但是当你调用你的其他函数时,你的程序会尝试写入堆栈,过去巨大的数组,以分配下一个堆栈帧。这是它崩溃的时候。

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