之前调试程序出现“segmentation fault”,即为常见的段错误。查了些资料,做个总结吧。
产生段错误就是访问了错误的内存段,一般是你没有权限,或者根本就不存在对应的物理内存,尤其是常见的访问0地址。
在编程中以下几类做法容易导致段错误,基本是错误的使用指针引起的:
1)访问系统数据区,尤其是往系统保护的内存地址写数据;
最常见就是给一个指针为0的地址。
2)内存越界(数据越界,变量类型不一致等)访问到不属于你的内存区域
下面就简单说一种找出段错误的方法:
就是将“段错误”这个内存访问越界的错误谈谈如何快速定位这些“段错误”的语句。
举个例子,这个也是我之前用过的,比较靠谱的一种。
- function(void)
- {
- unsigned char *ptr = 0x00;
- *ptr = 0x00;
- }
- int main()
- {
- function();
- return 0;
- }
具体步骤如下:
>> gcc -g -rdynamic ***.c
>>gdb ./a.out
/*******************************************************/
* 关于gdb的信息就全部省略
*******************************************************/
(gdb) r
…………
4 *ptr = 0x00;
(gdb)
就找到出错位置****.c文件的第4行,如此的简单。