为什么会出现“分段错误(核心已转储)”?

时间:2019-11-13 20:34:54

标签: c pointers fgets

我正在制作一个程序,让用户输入一行文本,然后该程序将其打印回给他们。他们以我完成作业的方式-更具体地说,使用char *read_line()方法-是我必须要做的作业。

当用户输入某些内容(例如他们的姓名)并按Enter键时,它只会显示“细分错误(核心已转储)”,我不知道为什么。

#include <stdio.h>

char *read_line(char *buf, size_t sz)  {
    if (fgets(buf, sz, stdin) && buf[0] != '\n' ) 
    {
        return buf;
    }
    else
    {
        return NULL;
    }
}

int main(int argc, char** argv) {
    char *buf;
    char *p;

    p = read_line(buf, 1024);

    if (p != NULL) {
        fputs(p, stdout);
    }

    return 0;
}

2 个答案:

答案 0 :(得分:3)

char *buf;

您已在此处声明了指向char的指针,但尚未初始化它。因此,它的值就是调用函数时堆栈中的值。

当您尝试访问它指向的内存时,这是一个随机的内存地址,几乎可以肯定是非法的内存访问。

要么使用malloc()分配一些指向的内存(不要忘记free()),要么将变量设置为另一个变量的地址。

答案 1 :(得分:1)

最简单的操作是更改以下内容:

char buf[1024];
p = read_line(buf, sizeof(buf));

或者,您可以执行以下操作:

char *buf;
p = read_line(&buf, 1024);

char *read_line(char **buf, size_t sz)
{
    *buf = malloc(sz);
    ...
}

如果使用此方法,请不要忘记free