C文件I / O中的Segfault

时间:2012-10-02 20:15:53

标签: c file-io

我正在尝试从FILE *中读取一串文本,但每次尝试时都会出现分段错误。这是我在程序中唯一做的事情,所以我不确定为什么会发生这种情况。

#include <stdio.h>

int main(){
  FILE* file;
  char* string;
  file = fopen("practice.txt", "r");
  fgets(string, 100, file);
  printf("%s", string);
  return 0;
}

4 个答案:

答案 0 :(得分:6)

您尚未为字符串分配任何内存。您可以使用malloc为字符串分配内存,或使用数组char string[100];

答案 1 :(得分:3)

请务必分配内存以存储您要阅读的内容:

char string[101];

答案 2 :(得分:1)

这是因为string未初始化。 stringchar *,最初将垃圾值保存为地址,fgets函数将其解除引用,从而导致未定义的行为。

要么

char string[BUFFER_LEN];

正确定义BUFFER_LEN

或做

char *string;
string = malloc (sizeof (char) * buf_siz);

其中buf_siz包含缓冲区的长度。 当您动态分配字符串时,请记住free (string)当您使用分配了malloc的内存块时,这是一个很好的做法,并且可以防止大型程序中的内存泄漏。

通过检查fopen的返回值,始终检查文件是否已成功打开。如果它返回NULL,则打开操作失败。否则它将返回FILE指针。

答案 3 :(得分:1)

char *string声明一个指针,但不会将其设置为指向任何有意义的位置;您尚未分配任何内存来存储从文件中读取的文本。

您需要分配一个数组,如下所示:

char string[101] = {0}; 
...
fread(string,100,file);
printf("%s\n", string);

或在运行时分配内存:

char *string;
...
string = calloc(101, sizeof *string);
if (string)
{
  fread(string,100,file)
  printf("%s\n", string);
  free(string);
}

在这两种情况下,我们为101个字符分配足够的内存来考虑0终结符,并且由于fread不会在输入的末尾写入0终结符,我们将内存初始化为所有位 - 两种情况都为零(第一种是使用初始化程序,第二种是使用calloc)。