无法解决" Bad Address"截断的fwrite中的错误

时间:2015-04-20 15:39:59

标签: c fwrite

我意识到从fwrite获取“错误地址”错误通常是 因为你有一个损坏的指针或一个不够大的缓冲区。但是,这似乎不是我的问题,我想不出可能导致这种情况的任何其他情况。

我已经确认:

  • 指向分配的缓冲区的指针有效
  • 分配的大小大于指定的fwrite大小
  • fwrite成功写了大约2/3的数据。
  • 实际上大量数据最终会在磁盘驱动器上结束。

在我的实际运行中,w = 5,rows = 750,152,bufSizeBytes = 6,001,216,bytesLen = 3,750,760,因此缓冲区大于它需要的值。但是,fwrite报告的字节实际写为2,252,800(在磁盘上确认),并给出错误14。

请注意,当我填充缓冲区时,我没有得到任何特定的访问错误 - 我不知道什么可以将此限制为仅2.2MB。 (我的硬盘驱动器也没有空间。):)

这是我的实际代码,删除了辅助部分:

    // This gives you an instant pointer cast

    typedef union
        {
        U8* b;
        void*   v;
    [ ... ]
        } olGenericPointer_t;

    // NOW in the function of interest:

    olGenericPointer_t pColumnBuf;
    S64 bufSizeBytes = sizeof(S64) * rows;
    pColumnBuf.v = malloc(bufSizeBytes); // handle max word size


    // Later in the code, after filling up the buffer with some data, we try to save it to disk...


    S64 bytesLen = w * rows;
    S64 bytes_written = 0;
    bytes_written = fwrite(pColumnBuf.v, 1, bytesLen, fp);

    if (bytes_written != rows * w)
        {
        printf("Error - only wrote %s of %s bytes to file %s: ",
                     olPrintInt(bytes_written), olPrintInt(rows*w),
                    pszOutput);

        printf("Error code is %d / %s\n", errno, strerror(errno));
        ff();
        }

    // close column file (should flush)
    olClose(fp);

0 个答案:

没有答案