文字バッファを関数に渡し、バッファのサイズを取得する
質問
バッファのサイズを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 へのポインタを渡していますcode> 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を使用します。