gpt4 book ai didi

c - Stacksmashing 甚至没有访问任何数据

转载 作者:太空宇宙 更新时间:2023-11-04 08:53:26 25 4
gpt4 key购买 nike

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

然后崩溃。如果我用 520720 替换 520721 我得到:

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 之外什么都不做,甚至不触及指针或它指向的数据。

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

非常感谢您的见解!

最佳答案

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

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

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

关于c - Stacksmashing 甚至没有访问任何数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18668565/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com