目录
-
- 1:现象
- 2:示例
- 3:原因
- 4:修改
- 5:总结
1:现象
在使用指针的时候经常会发生Segmentation fault。如下所示
2:示例
/*************************************************************************
> File Name: test5.c
> Author: kayshi
> Mail: [email protected]
> Created Time: Mon 07 Dec 2020 06:36:54 PM CST
************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct str{
char a;
char *p;
};
void show(struct str *str_s, int num)
{
int i;
for(i = 0; i < num; i++)
{
printf("show: ");
printf("%d ", str_s->a);
printf("%s\n", str_s->p);
str_s++;
}
}
int fun(struct str *str_m, int num)
{
int i;
for(i = 0; i < num; i++)
{
str_m->p = (char *)malloc(5);
str_m->a = i;
strcpy(str_m->p, "hello");
str_m++;
}
show(str_m, num);
return 0;
}
int main()
{
struct str *str_p;
int num = 3;
str_p = (struct str*)malloc(sizeof(struct str)*num);
fun(str_p, num);
}
代码函数:分配一个空间,空间大小是3个struct str这么大,让str_p指向这个空间的首地址。在fun种对每个结构体依次进行赋值操作。然后使用show函数来打印显示
执行:发生错误
[email protected]:~/code/Test$ ./a.out
Segmentation fault (core dumped)
3:原因
发生这个错误的原因是在函数fun中使用了str_m++,然后继续把str_m传递给了函数show中去。原本的意思赋值完后把首地址传递到函数中去。开始时,str_m指向首地址,由于自加导致了str_m发生了偏移。偏移之后的地址,是未被分配的空间。show再使用偏移后的地址,就会产生段错误的现象。
4:修改
只需要把空间的首地址传递给show就可以,那么利用一个临时指针变量str_tmp等于str_m,在函数fun中进行3次赋值,每次自加。那么就不会影响str_m。
修改fun函数
int fun(struct str *str_m, int num)
{
int i;
struct str *str_tmp = str_m;
for(i = 0; i < num; i++)
{
str_tmp->p = (char *)malloc(5);
str_tmp->a = i;
strcpy(str_tmp->p, "hello");
str_tmp++;
}
show(str_m, num);
return 0;
}
执行
[email protected]:~/code/Test$ ./a.out
show: 0 hello
show: 1 hello
show: 2 hello
5:总结
发生这种错误最可能的原因就是,使用了未正常分配的内存。