c - fread 导致堆溢出

标签 c overflow fread

使用下面的c代码片段

char charString[1024];

if (fread(charString, sizeof_data, 1, filePointer) != 1){ return false;}
else return true;

如果我提供 sizeof_data = 1024 并且 filePointer 指向的文件只能从文件中读取 10 个字节。我收到来自程序的中止信号。

如何优雅地处理它?<​​/p>

最佳答案

你说的不可能是真的:sizeof_data是1024,缓冲区也是1024,所以没有问题。所以问题出在你没有向我们展示的代码中。两种可能性:

  1. sizeof_data 大于缓冲区,并且您覆盖了堆栈(或其他数据);

  2. 您希望读取一个字符串,但不以“\0”终止它,然后打印它,导致 f/s/printf 导致段错误。

试试这个代码:

    char charString[1024];
    size_t n;

    if ((n=fread(charString, 1, (sizeof_data<1024?sizeof_data:1023), filePointer))==0)
        return false;
    CharString[n]='\0';          // terminate
    printf("%s\n",charString);   // safe to print now
    return true;

请注意,我们要读取字符,因此项目大小为 1,并且我们要读取最多 1023 个字符,因此计数最大为 1024。

关于c - fread 导致堆溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40268339/

相关文章:

c - 害怕 solaris 和 linux 下的结构差异

c - 如何获取与 NET-SNMP 注册回调关联的变量

c - 写入 char 数组,输出为空

c - 最大堆 ​​- C 中的样本

c - 当我尝试从文件加载数据时程序停止工作

c++ - 将某些字符和结构写入文件并读回时,fread 和 fwrite 出现问题

c - 我的代码在将数据类型从 float 更改为 double 时生成 -nan

CSS 溢出-y : auto does not reach the bottom of div

html - 位置为 : relative is hidden once button has focus in overflow-y:auto parent container 的所有内容

c - 如果存在明显的溢出可能性,我是否应该手动类型转换为更高的类型?