タイトルが示すように、私の質問は、で文字列のサイズを取得する方法Cです。sizeofそれ(文字列)を関数内で宣言していない場合に使用するのは良いmallocですか?または、ポインタとして宣言した場合はどうなりますか?で初期化した場合はどうなりmallocますか?徹底的な対応をお願いします。
5 に答える
strlenを使用できます。サイズは終了ヌル文字によって決定されるため、渡された文字列は有効である必要があります。
文字列を含むメモリバッファのサイズを取得する必要があり、それへのポインタがある場合:
- 動的配列(mallocで作成)の場合、コンパイラーはポインターが何を指しているのかわからないため、サイズを取得することはできません。(これをチェックしてください)
- 静的配列の場合は、を使用
sizeofしてそのサイズを取得できます。
動的配列と静的配列の違いについて混乱している場合は、これを確認してください。
nullで終了strlenする文字列の長さを取得するために使用します。
sizeof文字列ではなく配列の長さを返します。char *s配列()ではなくポインタ()の場合、ポインタchar s[]のサイズ(通常、32ビットシステムでは4バイト)が返されるため、機能しません。配列はポインタとして渡されるか返されると思います。そのためsizeof、配列のサイズをチェックするために使用する機能が失われます。
したがって、文字列が配列全体にまたがる場合(たとえばchar s[] = "stuff")、静的に定義されsizeofた配列に使用すると、必要なものが返されます(nullターミネータを見つけるためにループする必要がないため高速です)(最後の文字の場合)はヌルターミネータであるため、1)を引く必要があります。配列全体にまたがっていない場合は、必要なものが返されません。
これに代わる方法は、実際に文字列のサイズを格納することです。
このsizeof特定のタイプの文字列で機能しますが、次のようになります。
char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
strisポインタ(sizeofポインタのサイズを返す、通常は4または8)または指定された長さの配列(指定さsizeofれた長さに一致するバイト数を返します。char型の場合は同じです)の場合は機能しません。
を使用するだけstrlen()です。
sizeof()次にachar *strを使用すると、char str[]異なる回答が返されます。char str[]文字列の長さ(文字列ターミネータを含む)をchar *str返し、ポインタのサイズを返します(コンパイラによって異なります)。
私は使用するのが好きです:
(strlen(string) + 1 ) * sizeof(char)
これにより、バッファサイズがバイト単位で表示されます。これはsnprintf()で使用できます。
const char* message = "%s, World!";
char* string = (char*)malloc((strlen(message)+1))*sizeof(char));
snprintf(string, (strlen(message)+1))*sizeof(char), message, "Hello");
乾杯!働き:size_t strlen (const char *s)