私はこれらの変数を持っています:
uint32_t fsize;
char *filebuffer = NULL;
fsize = fileStat.st_size;
適切なメモリを mallocしたい場合、私が書かなければならないコードは次のとおりです。
malloc(fsize);
またはこれ:
malloc(fsize * sizeof(char *));
ありがとう!
sizeof(char*)
ポインタのサイズです。これはおそらくあなたが望むものではありません。名前で言えば、それfsize
はファイルのサイズ (バイト単位) であると想定しているので、単純な古いものです。
malloc(fsize);
結構です。
malloc()
指定されたバイト数を割り当てます。を呼び出すと、必要なバイト数 ( ) に、ポインタを格納するために必要なバイト数 (通常は 4 または 8 バイト) である追加の係数 をmalloc(fsize * sizeof(char *))
掛けているため、メモリの割り当てが多すぎます。.fsize
sizeof(char*)
割り当てられたメモリを最終的にポインターに割り当てるという事実は、割り当てるchar*
バイト数を決定する際には関係ありません。
あなたが書いた:
適切なメモリを malloc したい場合、私が書かなければならないコードは次のとおりです。
malloc(fsize); またはこれ:
malloc(fsize * sizeof(char *));
これら 2 つのステートメントの違いは、malloc(fsize) はファイルに文字を格納するのに十分なメモリを提供し、malloc(fsize * sizeof(char *)) はすべての文字を指すのに十分なポインタのアドレスを格納するのに十分なメモリを提供することです。ファイルで。
あなたが尋ねるべきことは次のとおりだと思います:
「またはこれ: malloc(fsize * sizeof(char));」
つまり、ファイル内の文字数に各文字のサイズを掛けた値を malloc したいのですが、これは合理的な質問ですが、sizeof(char) = 1 であるため、文字の場合は関係ありません。ファイルがテキストであるとしましょう。次の 4 文字が含まれています。
malloc(fsize) == malloc(4)
malloc(fsize * sizeof(char)) == malloc(4 * 1) == malloc(4)
malloc(fsize * sizeof(char *)) == malloc(4 * 4) == malloc(16)
4 の理由は、データのサイズではなく、アドレスのサイズ (例: 0x0035F900) をバイト単位で取得しているためです。
答えを明確にするのに役立つことを願っています。
malloc(size) 関数は size バイトのメモリ ブロックを割り当て、ブロックの先頭へのポインタを返します。このような:
uint32_t fsize = fileStat.st_size;
char* filebuffer = (char*)malloc(fsize);
そして忘れないでください
free(filebuffer);