所以我有一个程序可以工作,但是当我增加更多的局部变量时,它就会爆炸。
添加代码:
double prMaxT, prMinT, poMaxT, poMinT, linT;程序接收到信号EXC_BAD_ACCESS,无法访问内存。原因: KERN_INVALID_ADDRESS地址:0x00000000000000 0x0000000100001411 in bst_height (bst=0x0) at bst.c:72 72返回bst_height_node(bst->root);
flynn_p4(7171) malloc:*对象0x7fff5fc00760错误:未分配被释放的指针*在malloc_error_break中设置断点以调试中止陷阱
所有变量:
#define SIZE 1000
#define dSIZE 500
#define RUNS 5000
#define SEARCH_WIDTH 1501
#define SEARCHES 1000000
//main()
int rands[SIZE], dels[dSIZE], srch[SEARCHES], pre_h[RUNS], post_h[RUNS], i, j, z, found = 0, total = 0;
struct timeval whole_start, whole_end;
double prMaxT, prMinT, poMaxT, poMinT, linT;
struct bst *pre_max, *post_max, *pre_min, *post_min, *linear, *trees[RUNS];所有这些都给我的程序带来了大约1.2MB的内存占用,所以我已经解决了我能找到的所有漏洞。而且这个错误并不是gdb认为它在bst_height_node()中的地方,因为如果我注释掉double,一切都正常。
那么,堆栈上的内存main()有多少限制,我是否超过了它呢?我已经将大型数组移动到全局空间,但这并没有修复它,但最重要的是,我想知道发生了什么,而不仅仅是修复。
构建环境: gcc 4.2.1在MacOSX10.6.7-2010 Macbook Pro上(以防相关)
//编辑:我用gcc旗-pedantic解决了这个问题,它给了我:
gcc -pedantic -c -o bst.o bst.c gcc -pedantic -c -o main.o flynn_p4.c flynn_p4.c:在函数‘main’:flynn_p4.c:87:警告: ISO C90禁止混合声明和代码flynn_p4.c:131:警告: ISO C90禁止混合声明,代码-c -o flynn_p4 main.o bst.o
所以,我的int声明在功能完成一半时导致了这种情况,DOH!
发布于 2011-03-31 17:23:01
将-pedantic标志添加到gcc中,在函数执行过程中显示了一个out of place变量声明:
gcc -pedantic -c -o bst.o bst.c gcc -pedantic -c -o main.o flynn_p4.c flynn_p4.c:在函数‘main’:flynn_p4.c:87:警告: ISO C90禁止混合声明和代码flynn_p4.c:131:警告: ISO C90禁止混合声明,代码-c -o flynn_p4 main.o bst.o
-pedantic赢了这一轮
发布于 2011-03-31 13:49:18
不知道默认的堆栈限制是什么。我不是MacOS用户,但考虑到底层系统是unix,请在shell中尝试一个ulimit -a来列出进程限制。
我猜想它在内核中有一个硬限制,但是在达到它之前,您可以使用ulimit -s来增加进程堆栈限制。
(但我必须承认,如果它真的是堆栈溢出,我会期望得到不同的错误消息--它看起来更像是空指针)。
发布于 2011-03-31 13:26:28
对于这样的数据块,我肯定会在堆中分配它们。无论您是在堆栈上存储指针还是数组,代码都不会有太大的区别,但是堆栈大小的差别很大。是的,堆栈的大小是有限制的。
即使成功了,如果你(或者更糟的是其他人)想回来改变那些宏的大小,该怎么办呢?或者,如果您有两个具有大堆栈框架的函数,这些函数单独工作很好,但是在稍后的某个日期,您决定从另一个函数中调用一个函数。
https://stackoverflow.com/questions/5500566
复制相似问题