在C中添加更多局部变量时的EXC_BAD_ADDRESS

时间:2011-03-31 13:24:05

标签: c memory-management gdb

所以我有一个可行的程序,但是当我添加更多局部变量时,它就会爆炸。

添加了代码:

double prMaxT, prMinT, poMaxT, poMinT, linT;

程序收到信号EXC_BAD_ACCESS,无法访问内存。 原因:KERN_INVALID_ADDRESS位于地址:0x0000000000000000 位于bst.c:72的bst_height(bst = 0x0)中的0x0000000100001411 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,那么一切正常。

那么主机()在堆栈上可以有多少内存是有限制的,我是否超过它?我已经将大型数组移动到了全局空间并且没有修复它,但更多的是我想知道发生了什么而不仅仅是修复。

构建环境:Mac OS X 10.6.7 - 2010 Macbook Pro上的gcc 4.2.1(如果相关)

//编辑: 我用gcc flag -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禁止混合声明和代码   gcc -pedantic -o flynn_p4 main.o bst.o

所以我的int声明在函数中途引起了这个,DOH!

3 个答案:

答案 0 :(得分:2)

不知道默认的堆栈限制是什么。我不是MacOS用户,但考虑到底层系统是unix,请在shell中ulimit -a列出进程限制。

我猜它在内核的某个地方有一个硬限制,但在达到它之前,你可以用ulimit -s增加进程堆栈限制。

(但我必须承认,如果它确实是一个堆栈溢出,我会期望一个不同的错误消息 - 它看起来更像是一些空指针的东西)

答案 1 :(得分:1)

对于那样的数据块,我肯定会在堆上分配它们。无论你是在堆栈上存储指针还是数组,它对你的代码都没有太大的影响,但是与堆栈大小有所不同。是的,堆栈的大小有限制。

即使它确实有效,如果你(或者更糟的是,其他人)想要回来改变那些大小的宏呢?或者,如果你有两个具有大堆栈帧的函数,它们可以单独运行,但是在以后你决定从另一个函数调用它们会怎么样?

答案 2 :(得分:0)

向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禁止混合声明和代码   gcc -pedantic -o flynn_p4 main.o bst.o

-pedantic赢了本轮