我意识到从fwrite获取“错误地址”错误通常是 因为你有一个损坏的指针或一个不够大的缓冲区。但是,这似乎不是我的问题,我想不出可能导致这种情况的任何其他情况。
我已经确认:
在我的实际运行中,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);