使用指针而不是数组的分段错误

时间:2013-05-22 17:56:08

标签: c pointers segmentation-fault

while(!feof(fname))
{       
    fscanf(fname,"%c",buf);
    printf("%c",*buf);
    buf++;
}

当我使用此代码时,编译器会给我一个分段错误(核心转储)。 但如果我使用

而不是这个
int i = 0;
while(!feof(fname))
{       
    fscanf(fname,"%c",&buf[i]);
    printf("%c",buf[i]);
    i++;
}

此代码运行正常,并读取文件的内容。 在递增数组指针而不是将其用作数组时,我做错了什么? 整个代码是

    FILE *fname;
    fname = fopen("input.txt", "r");
    int i;
    char *buf;

    i=0;
    while(!feof(fname))
    {
    fscanf(fname,"%c",buf);
    printf("%c",*buf);
    buf++;

    }
    fclose(fname);

1 个答案:

答案 0 :(得分:2)

char *buf;

这是一个指针,没有与之关联的内存。

fscanf(fname,"%c",buf);

正在尝试将内存放入此指针。它需要为malloc'd,或者定义为不会从fscanf()输入溢出的char数组。

也许:

#define MAX_STRING_SIZE 255
char buf[MAX_STRING_SIZE];

其他信息修改

如果您需要移动指针,请创建第二个并使用它:

#define MAX_STRING_SIZE 255
char buffer_memory[MAX_STRING_SIZE];
char *buf = buffer_memory;
...
fscanf(fname,"%c",buf);
printf("%c",*buf);
buf++;

直到你读了255个字符,此时会发生不好的事情。如果您事先不知道文件的大小(ftell()),那么您将需要使用链接列表系统,realloc()模式,这有点icky,或者是一个保证的缓冲区要足够大以适应你的文件。