结构体指针之 段错误 详解(segmentation fault)
来源:互联网 发布:阴阳师挂机软件ios 编辑:程序博客网 时间:2024/05/29 17:23
一个网友问了我一个问题,一个C程序运行出现了段错误,这个问题非常好,很多初学者都容易犯这个错误,具体代码如下:
这个编译没有问题,但是运行是段错误 Segmentation fault
因为你定义了一个结构体指针p,用来指向此类结构体,但是你却没有给他赋值,此时p的值为NULL,你并没有在内存中为p分配任何空间,所以p->a=1这句就会出段错误。
修改方法1:可以给p分配一段内存空间,并使其指向此空间:
p=(struct abc *)malloc(sizeof(struct abc));
p->a = 1;
方法2:可以让p指向一个已存在的内存空间:
struct abc temp;
p=&temp;
p->a = 1;
对付段错误问题利用strace命令可以快速找出现问题的地方!!!!!
为什么会出现端错误呢?我也做了如下总结:
出现了Segmentation fault,基本上的原因是,非法的内存访问。
例如数组的越界,在循环操作时循环变量的控制问题,也有字符串拷贝时长度溢出,指针指向了非法的空间,还有就是申明一个指针,但却没有对其初始化,就直接引用,或者没有开辟内存空间就释放内存,所以要检查申请空间时间偶成功。
还有那个问题在调试时会有这样的信息:Program terminated with signal SIGSEGV, Segmentation fault.
对于SIGSEGV这个信号,经常会和SIGBUS信号出现在一块,
SIGBUS与SIGSEGV信号的一般区别如下:
1) SIGBUS(Bus error)意味着指针所对应的地址是有效地址,但总线不能正常使用该指针。
通常是未对齐的数据访问所致。
2) SIGSEGV(Segment fault)意味着指针所对应的地址是无效地址,没有物理内存对应该地址。
通常导致段错误的几个直接原因:
1、解除引用一个包含非法值的指针。
2、解除引用一个空指针(常常由于从系统程序中返回空指针,并未经检查就使用)。
3、在未得到正确的权限时进行访问。
4、用完了堆栈或堆空间(虚拟内存虽然巨大,但绝非无限)。
很多都说犯这种低级错误一般都是对程序不熟练,我不赞同这种说话,当我们开发一个大型的项目时候,随时都会出现这个问题,这种问题很常见重要的是我们怎么样去调试,解决错误。
这里给大家推荐几个方法:
添加打印语句,二分法打印。
利用starce看系统调用
使用gdb命令来调试
不管是哪一种方法只要能够解决你遇到的额问题,那么就是很好的。不要怕犯错误,重要的是能够解决错误。
- 结构体指针之 段错误 详解(segmentation fault)
- 段错误(segmentation fault)
- 段错误(segmentation fault)
- 总结段错误(Segmentation fault)
- 总结段错误(Segmentation fault)
- "Segmentation fault(段错误)"探究
- Segmentation fault(段错误)探究
- 总结段错误(Segmentation fault)
- 总结段错误(Segmentation fault)
- 段错误总结(segmentation fault)
- Linux段错误(Segmentation fault)
- mysql_real_query()段错误(Segmentation fault)
- 总结段错误(Segmentation fault) (转)
- [转载]Linux下“段错误”--segmentation fault[]
- 关于linux的段错误(Segmentation fault)
- 关于Segmentation fault(段错误)探究
- 段错误(segmentation fault)总结及调试
- linux下segmentation fault(段错误)总结
- NSRULConnection网络应用
- 打造自己的vim
- 笔记:继承设计的技巧
- C#连接数据库代码(基础)
- [数位DP] HDU4734 F(x)
- 结构体指针之 段错误 详解(segmentation fault)
- Hbase存储数据结构
- 指针和数组的不同
- 网络-NSURLSession应用和原理
- 位运算:二进制中1的个数
- 字符串匹配
- Android面试题搜集
- 魔道研究
- AFNetworking框架使用