【问题标题】:Writefile causes crash, with access violationWritefile 导致崩溃,访问冲突
【发布时间】:2013-06-16 05:39:54
【问题描述】:

所以基本上我希望将字节数组写入文件,但是程序崩溃了。 append.exe 中 0x7766DEE1 (KernelBase.dll) 处未处理的异常:0xC0000005:访问冲突写入位置 0x00000000。

BYTE *image ;
BYTE *bigMem;
#define REASONABLY_LARGE_BUFFER 16777216
file = CreateFile(fileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

fileSize = GetFileSize(file, NULL);

bigMem = (BYTE *)HeapCreate(NULL, REASONABLY_LARGE_BUFFER, 0);
image = (BYTE *)HeapAlloc(bigMem, HEAP_ZERO_MEMORY, fileSize);
if (bigMem == NULL || image == NULL){
    printf("Allocation failed");
    return EXIT_FAILURE;
}
printf("We are writing to the file %p, with data location %p, and filesize %d\n", file, image, fileSize);
LPDWORD at = 0;
WriteFile(file, image, fileSize, at, NULL);

那张印刷品说: 我们正在写入文件 00000038,数据位置为 02451590,文件大小为 161169

【问题讨论】:

  • 您确定 16MB 是“相当大”吗?如果操作系统不想给你那么多堆内存并且分配函数返回NULL怎么办?你从不检查,你应该检查。
  • 我只是将代码放入检查 bigMem 或 image 是否为空,而两者都不是。
  • 如果你添加错误检查,你应该检查文件是否真的被打开了。
  • 你应该检查bigMem == NULL 之前将它传递给HeapAlloc

标签: c++ file-io access-violation


【解决方案1】:

如果重叠结构的参数为not,则传递给WriteFile 的参数用于存储写入的字节数(at只能为空空值。我建议将 at 更改为 DWORD 并传递一个指向它的指针。

DWORD at;
WriteFile(file, image, fileSize, &at, NULL);

【讨论】:

  • 我不敢相信我错过了。尤其是在查看了他们评论不能为空的所有内容之后。
  • 它会发生,尤其是在您查看相同的代码一段时间后;)
  • 感谢您的回答,但出于对所有神圣事物的热爱,当他们提出这个限制时,他们在想什么?
  • @mercurytw 也许:WriteFile 得到了很多使用,所以让它的流程有一个额外的测试和分支将被认为是不可接受的性能损失。
  • 这个问题在Win8.1中不存在。
猜你喜欢
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 1970-01-01
  • 2012-10-21
  • 2020-05-24
相关资源
最近更新 更多