C语言学习(十二)——段错误(一)

学习C语言有一段时间了,作为一个新手,写的东西总是会出现很多错误,也该了不少错误。其中,特别难改的就是段错误;所以在这里总结一些遇到的段错误:

首先什么是段错误?一旦一个程序发生了越界访问,cpu 就会产生相应的保护,于是 segmentation fault 就出现了,通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的,还有可能是缺少文件或者文件损坏。

下面来分享一下我见过的段错误

1、void HeapSort(SqList*L)
{
int i;
for(i = L->length/2;i >= 1;i++)
{
HeapAdjust(L,i,L->length);//构成大顶堆
}

void HeapAdjust(SqList*L,int s,int m)
{
int j,temp;
temp = L->r[s];
for(j = 2*s;j <= m;j *= 2)
{
if(L->r[j] < L->r[j+1])
{
j++;
}
if(temp > L->r[j])
{
break;
}
L->r[s] = L->r[j];
s = j; 
}
L->r[s] = temp;
}

因为for语句的判断条件是i>= 1又每次for循环结束i自增所以for循环一直进行,那么当i的值大于length时调用HeapAdjust函数会导致数组下标越界这时数组就访问了未知的内存空间,可能导致段错误的产生!

2、在使用scanf是变量名前没有&符

3、访问不存在的内存地址

  1.     int *ptr = NULL;  
  2.     *ptr = 0;
这时由于指针ptr并没有指向内存空间,将0赋值给指针ptr显然会发生段错误

4、访问只读内存地址

  1. #include <stdio.h>  
  2.   
  3. int main (void)  
  4. {  
  5.     char *ptr = "hello";  
  6.     *ptr = 'H';  
  7.     return 0;  
  1. #include <stdio.h>  
  2. #include <string.h>  
  3.   
  4. int main (void)  
  5. {  
  6.     char *ptr = "test";  
  7.     strcpy (ptr, "TEST");  
  8.     return 0;  
  9. }
由于ptr指向的是常量区的字符串,所以只只读的,任何对于该字符串的修改都会引起段错误,如果要修改指针ptr只能以

ptr = "Hello"的形式使指针指向其他字符串!

5、动态内存释放完成后再次使用该指针

if(p1->start == t)//删除所选节点
{
p2->next = p1->next;
free(p1);

  //printf("%d",p1->data);

  return OK;

}

这时由于p1的内存空间已经被释放,再输出p1->data,显然会引发段错误

以上就是我现阶段常见的段错误,总结一下希望能对自己和个位有帮助,毕竟它太烦人了!


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值