Vì vậy, về cơ bản tôi muốn viết một mảng byte vào một tệp, tuy nhiên chương trình bị treo. Ngoại lệ chưa xử lý tại 0x7766DEE1 (KernelBase.dll) trong append.exe: 0xC0000005: Vi phạm quyền truy cập ghi vị trí 0x00000000.Writefile gây ra sự cố, với vi phạm truy cập
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);
Đó in nói: Chúng tôi viết vào file 00.000.038, với vị trí dữ liệu 02.451.590, và filesize 161169
Bạn có chắc chắn 16MB là "hợp lý lớn" không? Điều gì xảy ra nếu hệ điều hành không muốn cung cấp cho bạn nhiều bộ nhớ heap và hàm phân bổ trả về 'NULL'? Bạn ** không bao giờ ** kiểm tra điều đó, bạn nên. –
Tôi chỉ cần đặt mã vào để kiểm tra xem bigMem hoặc hình ảnh có null hay không. – ThePlague
Nếu bạn đang thêm kiểm tra lỗi, bạn nên kiểm tra xem tệp có thực sự được mở hay không. –