我正在尝试从FILE *中读取一串文本,但每次尝试时都会出现分段错误。这是我在程序中唯一做的事情,所以我不确定为什么会发生这种情况。
#include <stdio.h>
int main(){
FILE* file;
char* string;
file = fopen("practice.txt", "r");
fgets(string, 100, file);
printf("%s", string);
return 0;
}
答案 0 :(得分:6)
您尚未为字符串分配任何内存。您可以使用malloc为字符串分配内存,或使用数组char string[100];
答案 1 :(得分:3)
请务必分配内存以存储您要阅读的内容:
char string[101];
答案 2 :(得分:1)
这是因为string
未初始化。 string
是char *
,最初将垃圾值保存为地址,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
)。