33

タイトルが示すように、私の質問は、で文字列のサイズを取得する方法Cです。sizeofそれ(文字列)を関数内で宣言していない場合に使用するのは良いmallocですか?または、ポインタとして宣言した場合はどうなりますか?で初期化した場合はどうなりmallocますか?徹底的な対応をお願いします。

4

5 に答える 5

51

strlenを使用できます。サイズは終了ヌル文字によって決定されるため、渡された文字列は有効である必要があります。

文字列を含むメモリバッファのサイズを取得する必要があり、それへのポインタがある場合:

  • 動的配列(mallocで作成)の場合、コンパイラーはポインターが何を指しているのかわからないため、サイズを取得することはできません。(これをチェックしてください
  • 静的配列の場合は、を使用sizeofしてそのサイズを取得できます。

動的配列と静的配列の違いについて混乱している場合は、これを確認してください。

于 2013-02-21T11:04:20.793 に答える
15

nullで終了strlenする文字列の長さを取得するために使用します。

sizeof文字列ではなく配列の長さを返します。char *s配列()ではなくポインタ()の場合、ポインタchar s[]のサイズ(通常、32ビットシステムでは4バイト)が返されるため、機能しません。配列はポインタとして渡されるか返されると思います。そのためsizeof、配列のサイズをチェックするために使用する機能が失われます。

したがって、文字列が配列全体にまたがる場合(たとえばchar s[] = "stuff")、静的に定義されsizeofた配列に使用すると、必要なものが返されます(nullターミネータを見つけるためにループする必要がないため高速です)(最後の文字の場合)はヌルターミネータであるため、1)を引く必要があります。配列全体にまたがっていない場合は、必要なものが返されません。

これに代わる方法は、実際に文字列のサイズを格納することです。

于 2013-02-21T11:03:58.450 に答える
11

このsizeof特定のタイプの文字列で機能しますが、次のようになります。

char str[] = "content";
int charcount = sizeof str - 1; // -1 to exclude terminating '\0'

strisポインタ(sizeofポインタのサイズを返す、通常は4または8)または指定された長さの配列(指定さsizeofれた長さに一致するバイト数を返します。char型の場合は同じです)の場合は機能しません。

を使用するだけstrlen()です。

于 2013-02-21T11:13:19.890 に答える
4

sizeof()次にachar *strを使用すると、char str[]異なる回答が返されます。char str[]文字列の長さ(文字列ターミネータを含む)をchar *str返し、ポインタのサイズを返します(コンパイラによって異なります)。

于 2016-07-05T05:53:42.033 に答える
1

私は使用するのが好きです:

(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)

于 2015-12-30T03:42:54.917 に答える