タイトルが示すように、私の質問はC
で文字列のサイズを取得する方法です。 sizeof
を含まない関数で(文字列)を宣言した場合、malloc
を使用するのは良いですか?または、ポインターとして宣言した場合はどうなりますか? malloc
で初期化した場合はどうなりますか?徹底的な対応をしたいと思います。
strlen を使用できます。サイズは終端のヌル文字によって決定されるため、渡された文字列は有効である必要があります。
あなたの文字列を含むメモリバッファのサイズを取得したい場合、それへのポインタがあります:
sizeof
を使用してサイズを取得できます。動的配列と静的配列の違いについて混乱している場合は、 this を確認してください。
strlen
を使用して、nullで終わる文字列の長さを取得します。
sizeof
は、文字列ではなくarrayの長さを返します。ポインターの場合(char *s
)、配列ではありません(char s[]
)、ポインタのサイズ(32ビットシステムでは通常4バイト)を返すため、機能しません。配列はポインターとして渡されるか返されると考えているため、sizeof
を使用して配列のサイズを確認する機能は失われます。
そのため、文字列が配列全体に及ぶ場合のみ(例:char s[] = "stuff"
)、静的に定義された配列にsizeof
を使用すると、必要なものが返されます(必要ないので高速になります)ループスルーしてヌルターミネーターを見つけます)(最後の文字がヌルターミネーターの場合、1を引く必要があります)。配列全体に及ばない場合は、必要なものが返されません。
これらすべてに代わる方法は、実際に文字列のサイズを保存することです。
sizeof
はこの特定のタイプの文字列に対して機能しますが:
_char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'
_
str
がポインター(sizeof
がポインターのサイズ(通常は4または8)を返す)または指定された長さの配列(sizeof
が指定された長さに一致するバイトカウントを返す場合、動作しません、char型の場合は同じです)。
strlen()
を使用してください。
sizeof()
thenを使用すると、char *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)