学习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、访问不存在的内存地址
- int *ptr = NULL;
- *ptr = 0;
4、访问只读内存地址
- #include <stdio.h>
- int main (void)
- {
- char *ptr = "hello";
- *ptr = 'H';
- return 0;
- }
- #include <stdio.h>
- #include <string.h>
- int main (void)
- {
- char *ptr = "test";
- strcpy (ptr, "TEST");
- return 0;
- }
ptr = "Hello"的形式使指针指向其他字符串!
5、动态内存释放完成后再次使用该指针
if(p1->start == t)//删除所选节点
{
p2->next = p1->next;
free(p1);
//printf("%d",p1->data);
return OK;
}
这时由于p1的内存空间已经被释放,再输出p1->data,显然会引发段错误
以上就是我现阶段常见的段错误,总结一下希望能对自己和个位有帮助,毕竟它太烦人了!