gpt4 book ai didi

c - 奇怪的堆栈溢出?

转载 作者:太空狗 更新时间:2023-10-29 15:07:34 25 4
gpt4 key购买 nike

我遇到了一个奇怪的情况,将一个指针传递给一个结构,该结构具有在 struct{} 定义中定义的非常大的数组,一个大小约为 34MB 的 float 组。简而言之,伪代码如下所示:

typedef config_t{
...
float values[64000][64];
} CONFIG;


int32_t Create_Structures(CONFIG **the_config)
{
CONFIG *local_config;
int32_t number_nodes;

number_nodes = Find_Nodes();

local_config = (CONFIG *)calloc(number_nodes,sizeof(CONFIG));
*the_config = local_config;
return(number_nodes);
}


int32_t Read_Config_File(CONFIG *the_config)
{
/* do init work here */
return(SUCCESS);
}


main()
{
CONFIG *the_config;
int32_t number_nodes,rc;

number_nodes = Create_Structures(&the_config);

rc = Read_Config_File(the_config);
...
exit(0);
}

代码编译正常,但当我尝试运行它时,我会在 Read_Config_File() 下方的 { 处收到一个 SIGSEGV。

(gdb) run
...
Program received signal SIGSEGV, Segmentation fault.
0x0000000000407d0a in Read_Config_File (the_config=Cannot access memory at address 0x7ffffdf45428
) at ../src/config_parsing.c:763
763 {
(gdb) bt
#0 0x0000000000407d0a in Read_Config_File (the_config=Cannot access memory at address 0x7ffffdf45428
) at ../src/config_parsing.c:763
#1 0x00000000004068d2 in main (argc=1, argv=0x7fffffffe448) at ../src/main.c:148

我一直在用较小的数组做这种事情。奇怪的是,0x7fffffffe448 - 0x7ffffdf45428 = 0x20B8EF8,或者大约是我的 float 组的 34MB。

Valgrind 会给我类似的输出:

==10894== Warning: client switching stacks?  SP change: 0x7ff000290 --> 0x7fcf47398
==10894== to suppress, use: --max-stackframe=34311928 or greater
==10894== Invalid write of size 8
==10894== at 0x407D0A: Read_Config_File (config_parsing.c:763)
==10894== by 0x4068D1: main (main.c:148)
==10894== Address 0x7fcf47398 is on thread 1's stack

错误消息都指向我破坏了堆栈指针,但是 a) 我从来没有遇到过在函数入口时崩溃的错误消息,并且 b) 我传递的是指针,而不是实际的数组。

有人可以帮我解决这个问题吗?我在运行内核 2.6.18 和 gcc 4.1.2 的 64 位 CentOS 机器上

谢谢!

马特

最佳答案

您通过将这些巨大的 config_t 结构之一分配到堆栈上而炸毁了堆栈。 gdb 输出中证据的两个堆栈指针 0x7fffffffe448 和 0x7ffffdf45428 非常暗示这一点。

$ gdb
GNU gdb 6.3.50-20050815 ...blahblahblah...
(gdb) p 0x7fffffffe448 - 0x7ffffdf45428
$1 = 34312224

您的 ~34MB 常量与 config_t 结构的大小相匹配。默认情况下,系统不会为您提供那么多的堆栈空间,因此要么将对象移出堆栈,要么增加您的堆栈空间。

关于c - 奇怪的堆栈溢出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8935020/

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