出于某种原因,fopens在我的程序中不断崩溃。
当我读取输入文件并将内容放入变量时,它会工作一次。但出于某种原因,当我试图让它再次使用fopens时,它会崩溃......
有人可以帮忙吗
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *buf = "\0";
char buffer[99999] ;
int main(int argc, char *argv[])
{
ptr_file =fopen(inputFileLocation,"r");
if (!ptr_file)
{
return 1;
}
while (fgets(buf,maxvalue, ptr_file)!=NULL)
{
strcat(buffer,buf);
}
fclose(ptr_file);
... //workings
//then the program crashes if I add an fopen() and fclose() at the end
}
答案 0 :(得分:1)
接受的答案忽略了这一点。它不仅仅是关于缓冲区溢出。
maxvalue = 2;
没有缓冲区溢出,但程序将崩溃。
但是一步一步:
fgets(buf, maxvalue, ptr_file) != NULL
C库函数
char *fgets(char *str, int n, FILE *stream)
从指定的流中读取一行并将其存储到字符串中 由str
指出。当读取(n-1)
个字符时,它会停止 读取newline
字符,或达到end-of-file
, 以先到者为准。自动附加null
个字符 读取字符后的str表示C string
的结束。
在您的情况下,buf
是大小为2
的字符串文字。这很可能对您的需求而言太小。
但它不仅仅是buf
的大小!
您无法将任何内容复制到(常量)字符串文字!即使您读取了一个字符,该操作也会使用信号11
使您的程序崩溃。
常量是指程序在执行期间不会改变的固定值。这些固定值也称为文字。
您需要的是适当大小的char array
。
您可以使用与char buffer[99999]
// 1.
char buf[SIZE_OF_THE_BUF]; // remember that buf has to accept maxvalue-1 characters + `null` character
或在main()
// 2.a
char *buf;
//
int main()
{
// 2.b
buf = malloc(maxvalue * sizeof(char));
//...
}
答案 1 :(得分:0)
您创建一个名为buf的指针,指向包含单个字符&#39; \ 0&#39;的空格。 然后使用fgets()尝试读取未知数量的字符(您不会显示maxvalue是什么)到buf指向的空间。但那个空间只有一个字符长。读入它会占用空间,造成不确定的行为。