タイトルが示すように、私の質問は、で文字列のサイズを取得する方法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'
str
isポインタ(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)