【问题标题】:fopen() crashing on second use in c [closed]fopen()在c中第二次使用时崩溃[关闭]
【发布时间】:2018-02-24 20:16:18
【问题描述】:

由于某种原因,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

}

【问题讨论】:

  • 发布一个显示您的问题并且可编译的最小示例。如果您无法展示到目前为止的问题,那么没有人会提供帮助。
  • @joe 没什么好展示的,当包含 fopen() 和 fclose() 时,程序只是崩溃,没有错误消息
  • 显示代码。很多人多次使用 fopen 和 fclose 都没有问题,所以问题很可能在您的使用中。
  • 你要发布不起作用的代码吗?
  • 您正在将fgets 用于单个字符缓冲区(可能是只读的,但无论如何您几乎肯定会覆盖其他内存)。为什么不直接使用fgetsbuffer

标签: c fopen


【解决方案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));
 //...
} 

【讨论】:

    【解决方案2】:

    您创建了一个名为 buf 的指针,它指向包含单个字符 '\0' 的空间。 然后您使用 fgets() 尝试将未知数量的字符(您没有显示 maxvalue 是什么)读取到 buf 指向的空间中。但是那个空格只有一个字符长。读入它会超出空间,导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-17
      • 1970-01-01
      • 2020-11-29
      相关资源
      最近更新 更多