C++ Writefile导致崩溃,访问冲突
所以基本上我想把一个字节数组写入一个文件,但是程序崩溃了。 append.exe中0x7766DEE1(KernelBase.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x00000000C++ Writefile导致崩溃,访问冲突,c++,file-io,access-violation,C++,File Io,Access Violation,所以基本上我想把一个字节数组写入一个文件,但是程序崩溃了。 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_EXIS
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如果重叠结构的参数不为空,则传递给用于存储写入字节数(at
)的参数只能为空。我建议将at
更改为DWORD
,并向其传递一个指针
DWORD at;
WriteFile(file, image, fileSize, &at, NULL);
您确定16MB“相当大”吗?如果操作系统不想给您那么多堆内存,而分配函数返回
NULL
,该怎么办?你永远不会检查它,你应该这样做。我只是把代码放进去检查bigMem或image是否为null,两者都不是。如果你要添加错误检查,你应该检查文件是否也已实际打开。在将其传递给HeapAlloc
之前,你应该检查bigMem==null
,我不能相信我错过了这一点。尤其是在查看了所有它们注释它不能为null的代码之后。这种情况会发生,尤其是在您查看了一段时间相同的代码之后;)谢谢你的回答,但是出于对所有神圣事物的热爱,当他们想到这个约束时,他们在想什么?@mercurytw也许:WriteFile得到了大量的使用,因此对其流进行额外的测试和分支将被认为是一个不可接受的性能损失。顺便说一句,Win8.1中不存在这个问题。