一、段错误原因
(1)往收到系统保护的内存地址写数据。常见的没有取数据的地址复制给指针,所以使用指针时记得初始化,使用时判断是否为NULL;(以下都是错误例子)
例:int i ; int *p=i;
char *k; k=null; *k='y'
(2)数组越界,赋值类型不一致。
(3)线程创建失败,导致pthread_join访问不存在的内存。出现段错误。
二、调试方法
(1)利用printf()定位错误范围,排除错误。
(2)利用gdb调试,查看core文件。
三、写程序注意事项
(1)定义指针时一定要初始化,使用时判定是否为NULL。
例如:int *a=malloc(sizeof(int)); 用完后 free(a);
(2)指向常量区的指针不可更改,例如 char *p="hello world";不可对指针指向的内容更改。char p[]="hello world";这样可以更改。
例如:char *p;
*p="hello world"; 定义错误;
p=="hello world";此时赋给的是地址。正确。
(3)避免指针成为野指针
1.初始化指针时即把指针赋值为NULL,或指向合法的内存区域。
例如:free(p); int *k=new int(6);
if(p!=NULL) delete(p);
p=NULL; p=NULL;
if(p!=NULL)
{处理语句}
2.指针操作超过了变量的作用范围,比如不要范围指向栈内存的指针或者引用,栈内存使用后即被注销。