質問

バッファのサイズを100に設定しました。 バッファーが宣言されているメイン関数でバッファーを表示します。 ただし、バッファを関数に渡してsizeof '4'を取得すると、 私はそれが100であるべきだと思っていました、それは私がバッファのサイズだからです メインで作成されました。     出力:     バッファサイズ:100     sizeof(buffer):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バイト)を使用しています。

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

void load_buffer(char * buffer, size_t bufSize)
{    
    ...
}

他のヒント

Mitch Wheatとhhafezの答えは完全に正しいものです。私は時々役に立つかもしれないいくつかの追加情報を示します。

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

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

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

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

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

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

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

それをやっている人は誰もいませんし、私も自分でやっていません。引数を渡すのがかなり難しいからです。しかし、それについて知るのは良いことです。このような関数を呼び出すことができます

load_buffer(&buffer)

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

OPから

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

load_buffer()はrefrenceによって buffer に渡されると想像できますが、実際に起こっているのは char by value。実際の配列は渡されないため、 load_buffer()関数がバッファ配列のサイズを知る方法はありません

では、 sizeof(buffer)は何をしていますか? charへのポインタのサイズを返すだけです。 load_buffer() buffer のサイズを必要とする場合、精通して渡す必要があります。

または、char配列と配列のサイズの両方を含む新しい構造体を作成し、代わりにその構造体へのポインターを渡すことができます。その場合、バッファーとそのサイズは常に一緒になります;)

何が起こるかというと、配列を関数に渡すとき、配列のサイズではなく、メモリ内の配列のアドレスのみを渡すということです。 size_(buffer)がload_buffer()で出力しているのは、ポインターのサイズで、4バイトです。

関数でバッファのサイズを維持する最良の方法は、関数を次のように変更することです

void load_buffer(char *buffer, int length);

および次の呼び出し:

load_buffer(buffer, sizeof(buffer));

そしてバッファのサイズが欲しいときはいつでもlengthを使用します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top