2013-06-16 5 views
7

基本的には、ファイルにバイト配列を書きたいが、プログラムがクラッシュする。 append.exeの0x7766DEE1(KernelBase.dll)で未処理の例外が発生しました。0xC0000005:0x00000000という場所にアクセス違反が書き込まれました。Writefileがクラッシュし、アクセス違反が発生する

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); 

は、印刷は言うこと: 私たちは、データの場所02451590、およびファイルサイズで、ファイル00000038に書いている161169

+0

16MBが「合理的に大きい」ことは確かですか? OSがそれほど多くのヒープメモリを与えたくなく、割り当て関数が 'NULL'を返す場合はどうなりますか?あなたは決してそれをチェックしないでください。 –

+0

私はbigMemかimageのどちらかがnullであるかどうかを調べるためにコードを入力します。 – ThePlague

+0

エラーチェックを追加する場合は、ファイルが実際に開かれたことを確認する必要があります。 –

答えて

13

書き込まれたバイト数(at)を格納するために使用WriteFileに渡される引数ことができますオーバーラップした構造体の引数がでない場合は、のみがNULLになります。 nullです。 atDWORDに変更し、それにポインタを渡すことをお勧めします。

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

私はそれを逃したとは思えません。特に、それらがヌルではないとコメントするすべてのものを見た後。 – ThePlague

+0

これはしばらくの間、同じコードを見た後に起こります) –

+0

答えをありがとう、しかし、すべてのものが大好きで、彼らはその制約を思い付いたときに何を考えていましたか? – mercurytw

関連する問題