首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在C中添加更多局部变量时,EXC_BAD_ADDRESS

当在C中添加更多局部变量时,EXC_BAD_ADDRESS
EN

Stack Overflow用户
提问于 2011-03-31 13:24:04
回答 3查看 731关注 0票数 0

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

添加代码:

代码语言:javascript
复制
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中设置断点以调试中止陷阱

所有变量:

代码语言:javascript
复制
#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!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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赢了这一轮

票数 0
EN

Stack Overflow用户

发布于 2011-03-31 13:49:18

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

我猜想它在内核中有一个硬限制,但是在达到它之前,您可以使用ulimit -s来增加进程堆栈限制。

(但我必须承认,如果它真的是堆栈溢出,我会期望得到不同的错误消息--它看起来更像是空指针)。

票数 2
EN

Stack Overflow用户

发布于 2011-03-31 13:26:28

对于这样的数据块,我肯定会在堆中分配它们。无论您是在堆栈上存储指针还是数组,代码都不会有太大的区别,但是堆栈大小的差别很大。是的,堆栈的大小是有限制的。

即使成功了,如果你(或者更糟的是其他人)想回来改变那些宏的大小,该怎么办呢?或者,如果您有两个具有大堆栈框架的函数,这些函数单独工作很好,但是在稍后的某个日期,您决定从另一个函数中调用一个函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5500566

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档