1

我正在尝试从 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

4 回答 4

6

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

于 2012-10-02T20:17:06.543 回答
3

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

char string[101];
于 2012-10-02T20:20:05.810 回答
1

那是因为string未初始化。string是 achar *并且最初将垃圾值保存为地址,该地址被fgets函数取消引用,从而导致未定义的行为。

要么做

char string[BUFFER_LEN];

BUFFER_LEN适当定义

或者做

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

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

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

于 2012-10-02T20:26:42.437 回答
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)。

于 2012-10-02T20:27:50.440 回答