Segment fault错误

stuarts740 2010-03-19 10:03:04
我的程序结构如下:
int main()
{
//调用函数
a();
b();
c();
return 0;
}

我在每个函数的最开始加了输出语句:cout<<__FUNCTION__<<endl;
在函数执行结束后加了输出语句:cout<<"done"<<endl;

结果输出如下:
a
done
b
done
segment fault

这时是否可以判断函数c出错了?为什么b执行完都不进去c里面,直接就segment fault了呢?
还有,这个程序在虚拟机里可以正常运行,放在板子里就出现这样的错误
望高手们指点!!!
...全文
184 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
谭海燕 2010-03-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 stuarts740 的回复:]
我尝试修改程序代码后,将比较大的内存使用变量,改为了动态分配内存,还是会出现段错误。
而且奇怪的是,出现段错误的地方变了,之前没有问题的一个函数也出现段错误了!

有没有可能是板子上依赖库的问题?
[/Quote]

不一定,其实你在虚拟机上跑你的程序,它已经为你的程序做了很多假定,比如内存分配都是按合理的方式分配,访问都是合法的不会越界啊等等

这个你最好用gdb调试下,监视下相关变量,然后才好对症下药。
cnwolf 2010-03-21
  • 打赏
  • 举报
回复
提供各思路

b函数内存写越界,覆盖了stack中的返回地址,执行完b取下一条指令时就出错了

stuarts740 2010-03-21
  • 打赏
  • 举报
回复
问题已解决,谢谢大家的热心帮助
果然是要把栈内存改为堆内存,还有尽量减少全局变量的使用
stuarts740 2010-03-21
  • 打赏
  • 举报
回复
我尝试修改程序代码后,将比较大的内存使用变量,改为了动态分配内存,还是会出现段错误。
而且奇怪的是,出现段错误的地方变了,之前没有问题的一个函数也出现段错误了!

有没有可能是板子上依赖库的问题?
stuarts740 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 nevil 的回复:]
b()和c()的cout<<__FUNCTION__<<endl;之间没有任何别的东西了?
如果只是简单的函数调用不应该会出来segment fault
[/Quote]

函数太大,我不方便贴出来
总之就是,执行完b后,就显示segment fault
根本不进去c函数里执行
nevil 2010-03-19
  • 打赏
  • 举报
回复
b()和c()的cout<<__FUNCTION__<<endl;之间没有任何别的东西了?
如果只是简单的函数调用不应该会出来segment fault
stuarts740 2010-03-19
  • 打赏
  • 举报
回复
typedef struct tagMinutiae {
int x; // 横坐标
int y; // 纵坐标
int Direction; // 方向
int Triangle[3]; // 特征点为中心外接圆半径为定值的正三角形三个顶点的方向
int Type; // 类型
} MINUTIA, *MINUTIAPTR;
这是我的结构体
ghostwcy 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 stuarts740 的回复:]

函数b执行完成了,不进入c,然后就输出segment faultl

c中定义了变量
MINUTIA tempFork[MAXRAWMINUTIANUM];
MINUTIA tempEnd[MAXRAWMINUTIANUM];
MINUTIA ForkArr[MAXRAWMINUTIANUM];
MINUTIA EndArr[MAXRAWMINUTIA……
[/Quote]
估计是栈不够用了,在虚拟机上,内存随你用
在板子上,内存是非常少的,没有足够的栈够你调用函数c()了
ma100 2010-03-19
  • 打赏
  • 举报
回复
是不是结构体很大,导致栈内存太大了,试着变为堆内存
stuarts740 2010-03-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 ghostwcy 的回复:]
在调用b()和c()间增加调试一条输出语句,确认是在从b()函数返回还是在进入c()函数时失败

这两个函数中是否有汇编代码
[/Quote]

没有汇编代码
stuarts740 2010-03-19
  • 打赏
  • 举报
回复
函数b执行完成了,不进入c,然后就输出segment faultl

c中定义了变量
MINUTIA tempFork[MAXRAWMINUTIANUM];
MINUTIA tempEnd[MAXRAWMINUTIANUM];
MINUTIA ForkArr[MAXRAWMINUTIANUM];
MINUTIA EndArr[MAXRAWMINUTIANUM];

memset((void *)&tempFork[0], 0, MAXRAWMINUTIANUM*sizeof(MINUTIA));
memset((void *)&tempEnd[0], 0, MAXRAWMINUTIANUM*sizeof(MINUTIA));
memset((void *)&ForkArr[0], 0, MAXRAWMINUTIANUM*sizeof(MINUTIA));
memset((void *)&EndArr[0], 0, MAXRAWMINUTIANUM*sizeof(MINUTIA));

MINUTIA是结构体
#define MAXRAWMINUTIANUM 100

难道这样就出问题了?
wuyu637 2010-03-19
  • 打赏
  • 举报
回复
1. 先确定b函数是否执行完成。

在b函数后面加个log输出。如果执行到这里,说明b没有问题。

那么就是c的问题,c函数的开始执行的时候,会给函数的局部变量在堆栈上分配空间,你在c里面是否使用了很大的变量?
ghostwcy 2010-03-19
  • 打赏
  • 举报
回复
在调用b()和c()间增加调试一条输出语句,确认是在从b()函数返回还是在进入c()函数时失败

这两个函数中是否有汇编代码

23,217

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧