为什么这段代码是segfaulting? (指针运算)

时间:2014-02-09 10:38:41

标签: c pointers char segmentation-fault

出于某种原因,这段代码是segfaulting,原因我无法找到。

char *read_line(FILE *fp)
{
    char *out;
    int counter = 0;
    char c = getc(fp);

    while (c != '\n' && c != EOF)
    {
        *(out + counter) = c;
        counter++;
        c = getc(fp);
    }

    if (c == EOF || feof(fp))
    {
        return NULL;
    }

    *(out + counter) = '\0';
    return out;
}

我已经尝试在gdb中运行它,这告诉我段错误在*(out + counter) = c;。我无法弄清楚我做错了什么,还有其他人吗?

1 个答案:

答案 0 :(得分:6)

您没有为out分配任何值,因此它可能指向一些无效的内存地址。

您可能想要做的是先找到数据的长度,然后分配所需的内存量,然后将实际数据读入已分配的内存:

char *out;
int counter = 0;
char c = getc(fp);
while (c != '\n' && c != EOF) {
    counter++;
    c = getc(fp);
}

out = malloc(counter+1);
fseek(fp,0,SEEK_SET);

counter = 0;
c = getc(fp);
while (c != '\n' && c != EOF) {
    *(out + counter) = c;
    counter++;
    c = getc(fp);
}
*(out + counter) = 0;

当你完成使用它时不要忘记free(out) ......

BTW,而不是第二个for循环,您只需使用fgets(out,count,fp)