12

バッファーのサイズを 100 に設定しました。バッファーが宣言されているメイン関数でバッファーを表示します。ただし、バッファを関数に渡してサイズ「4」を取得すると、メインで作成したバッファのサイズであるため、100 にする必要があると考えていました。出力: バッファ サイズ: 100 sizeof(バッファ): 4

#include <string.h>
#include <stdio.h>

void load_buffer(char *buffer);

int main()
{
    char buffer[100];
    printf("buffer size: %d\n", sizeof(buffer));
    load_buffer(buffer);

    return 0;
}

void load_buffer(char *buffer)
{
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}
4

4 に答える 4

24

バッファーのサイズではなく、バッファーへのポインターのサイズ (4 バイト) を使用しています。

C では、バッファーのサイズを個別に渡す必要があります。これが、バッファー オーバーランが非常に簡単かつ頻繁に発生する理由の一部です。

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}
于 2009-03-04T04:52:19.787 に答える
23

Mitch Wheat と hhafez による回答は完全に正しく、的を射ています。時々役立つかもしれないいくつかの追加情報を示します。

適切なサイズの配列があることをコンパイラに伝えた場合も、同じことが起こることに注意してください。

void load_buffer(char buffer[100]) {
    /* prints 4 too! */
    printf("sizeof(buffer): %d\n", sizeof(buffer));
}

パラメータとしての配列は、ポインタを宣言しているだけです。char *nameとして宣言されていても、コンパイラはそれを自動的に に変更しchar name[N]ます。

呼び出し元にサイズ 100 の配列のみを渡すように強制したい場合は、代わりに配列のアドレス (およびその型) を受け入れることができます。

void load_buffer(char (*buffer)[100]) {
    /* prints 100 */
    printf("sizeof(buffer): %d\n", sizeof(*buffer));
}

これは、メインにある配列へのポインターであるため、配列を取得するには関数で逆参照する必要があります。インデックス作成は次の方法で行われます

buffer[0][N] or (*buffer)[N]

私が知っている誰もそれをしていませんし、私自身もそうしていません。しかし、それについて知ることは良いことです。このように関数を呼び出すことができます

load_buffer(&buffer)

他のサイズも受け入れたい場合は、他の2つの回答が推奨するpassing-Nオプションを使用します。

于 2009-03-04T05:11:58.023 に答える