实习笔记(十)——linux下运行提示“段错误(core dumped)”

这个错误在运行时出现过很多次,网上的解释是“Linux下的C程序常常会因为内存访问错误等原因造成segment fault(段错误),此时如果系统core dump功能是打开的,那么将会有内存映像转储到硬盘上来,之后可以用gdbcore文件进行分析,还原系统发生段错误时刻的堆栈情况。这对于我们发现程序bug很有帮助。

 

gdb的使用是个挺麻烦的事,我试着用了一下,但是,并不能如网上说的能定位到出错的语句行,而且很奇怪的是,我生成不了core文件,设置都有设置过了,也就顶多提示到出错的文件。

设置参考:http://www.linuxers.cn/2010/01/19/linux下发生段错误时如何产生core文件/

 

后来,还是直接从内存访问错误着手了,因为是多线程,用调试也挺麻烦的,我直接在代码中插输出提示语句,看走到哪一步出错。

似乎一般出来段错误的语句都是strcpy()、memcpy()这些与内存操作有关的函数。

我最常出错的是,把一个字符串拷贝到一个指针中。

如:

char *p = null;

strcpy(p,"Hello world!/n");

 

这样就会出错了,网上找到的解释是“当用字符串文本来初始化类型为 char * 变量时,一些编译程序可能将字符串放置在内存中不能修改字符串的位置内。如果需要修改字符串文本,则应该存储在字符数组中,以确保可以在所有的系统上进行修改。

指针分配的空间大小不定,这样随便给它重新赋值是不行的,而在初始化时赋值才是可以的,如下:

char *p = "Hello world";

 

于是,把p改为数组可以解决这个问题:char p[20];

我也会动态地给p分配内存,用new操作,但是网上有说这样做不好。

char *p = null;

p = new char[20];

strcpy(p,"Hello world!/n");

……

delete[] p;

p = null;

其实我是不太明白这样有什么的不好,一开始是在栈区定义了个指针p,然后在需要的时候,用new在堆区分配了个适当大小的内存,把指针指向该分配的内存。

个人觉得,这里最重要的是到最后一定要记得手动把分配的空间释放掉(delete),如不释放会很麻烦。

 

 

注意:new malloc 申请的内存,都需要手工清除的,new 适用于小块内存分配,malloc适用于较大的内存分配。

1 - 有编译器自动分配释放

2 - 一般由程序员分配释放,若程序员不释放,程序结束时可能由OS回收

3全局区(静态区),全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。- 程序结束释放

4另外还有一个专门放常量的地方。 - 程序结束释放

内存分配的资料: http://blog.csdn.net/colinchan/archive/2010/02/23/5319979.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值