2012-02-05 17 views
1

バイナリファイルから内容を読み込んでいます。私がcharとしてデータ要素を読み込んだ場合、mallocエラーは発生しませんが、他のデータ型、shortまたはintと言って読み込むと、プログラムは正しくバイトを読み込みますが、がフリーのポインタこれは、ヒープが破損している可能性があります。誰かが何をしているのか教えてもらえますか?私のfreadプログラムに何が間違っていますか?

コード:

#include <stdio.h> 
#include <stdlib.h> 

#define TYPE int //char or short 

int main() { 
    FILE * pFile; 
    long lSize; 
    TYPE * buffer; 
    size_t result; 

    pFile = fopen ("4.bin" , "rb"); 
    if (pFile==NULL) {fputs ("File error",stderr); exit (1);} 

    // obtain file size: 
    fseek (pFile , 0 , SEEK_END); 
    lSize = ftell (pFile); 
    rewind (pFile); 

    // allocate memory to contain the whole file: 
    buffer = (TYPE*) malloc (lSize/sizeof(TYPE)); 
    if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);} 

    // copy the file into the buffer: 
    result = fread (buffer,sizeof(TYPE),lSize/sizeof(TYPE),pFile); 
    if (result != lSize/sizeof(TYPE)) {fputs ("Reading error",stderr); exit (3);} 
    perror("This is the problem: "); 
    /* the whole file is now loaded in the memory buffer. */ 

    // terminate 
    fclose (pFile); 
    free (buffer);    // free causes heap related issue 
    return 0; 
} 
+0

"ファイルエラー" を読むべきではありません役に立つエラーメッセージ。 perror(ファイル名)が望ましい –

答えて

1

mallocがパラメータとしてバイト単位のサイズをとるので、ライン

buffer = (TYPE*) malloc (lSize/sizeof(TYPE)); 

buffer = (TYPE*) malloc (lSize); 
+0

いいえ、 "buffer = malloc(lSize * sizeof * buffer);"にする必要があります。 –

+0

@ウィリアム・プルセル:いいえ。 ftellはバイト単位で報告します。バッファ=(TYPE *)malloc(lSize);ヌル終了しない可能性のあるC文字列を扱っていない限り正しいです。 – JimR

+0

@JimRあなたは正しいです、私はスタイルにもっと焦点を当てていましたし、大きさが何であるかを見ていませんでした。実際にはエラーのように見えるので、lSizeがファイルのサイズであることを示すコメントが付いた "buffer = malloc(lSize)"にする必要があります。 –

関連する問題