天天看点

Segmentation fault (core dumped)问题

目录

    • 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:总结

发生这种错误最可能的原因就是,使用了未正常分配的内存。

继续阅读