web-dev-qa-db-ja.com

CのSizeof(char [])

このコードを検討してください:

 char name[]="123";
 char name1[]="1234";

そしてこの結果

The size of name (char[]):4
The size of name1 (char[]):5

char[]のサイズが常にプラス1であるのはなぜですか?

6
user1968030

Michaelがコメントで指摘したように、文字列はゼロで終了します。したがって、メモリ内の最初の文字列は次のようになります

"123\0"

どこ \0は単一の文字であり、ASCII値0です。次に、上記の文字列のサイズは4です。

この終了文字がなかった場合、文字列(またはchar[]そのことについて)終了しますか?さて、確かにもう1つの方法は、長さをどこかに格納することです。一部の言語はそれを行います。 Cはしません。

11
TobiMcNamobi

sizeofstrlenの違いに注意してください。 1つ目は、データ項目全体のサイズを指定する演算子です。 2つ目は、文字列の長さを返す関数です。これは、割り当てられたスペースの実際に使用されている量に応じて、sizeofよりも短くなります(文字列のオーバーフローを取得できた場合を除く)。

あなたの例では

_char name[]="123";
_

_'\0'_が終了するため、sizeof(name)は4であり、strlen(name)は3です。

しかし、この例では:

_char str[20] = "abc";
_

sizeof(str)は20、strlen(str)は3です。

15
Weather Vane

Cでは、文字列はcharsの配列として格納されます。認識された終了文字('\0' あるいは単に 0)それ以上のメタデータを必要とせずに、文字列へのポインタを渡すことができます。文字列を処理するときは、終了値に達するまで、ポインタが指すメモリから文字を読み取ります。

配列の初期化では文字列リテラルを使用しているため、次のようになります。

char name[]="123";

と同等です:

char name[]={'1','2','3',0};

配列のサイズを3にする場合(文字列を格納していないため、終了文字を使用しない場合は、次を使用します。

char name[]={'1','2','3'};

または

char name[3]="123";

(ありがとうalk)あなたが期待していたようにそれをします。

2
Baldrickk

C(およびおそらくすべてのプログラミング言語-舞台裏)のStringは、ASCII値の_\0_で終了する文字の配列です。 0の。

_char arr[] = "1234";_を割り当てるときは、文字列リテラルを割り当てます。これは、デフォルトではnullで終了します(_\0_はnullとも呼ばれます) ここ

Nullを回避するには(文字列ではなくcharsの配列のみが必要であると想定)、次のように宣言できます_char arr[] = {'1', '2', '3', '4'};_すると、プログラムは希望どおりに動作します(sizeof(arr)は4)になります。

1
Zach P
name = {'1','2','3','\0'};
name1 = {'1','2','3','4','\0'};

そう

sizeof(name) = 4;
sizeof(name1) = 5;

sizeofはオブジェクトのサイズを返します。この場合、オブジェクトは配列であり、配列の長さは、最初のケースでは4バイト、2番目のケースでは5バイトであると定義されています。

1
Gopi

Cでは、文字列リテラルにnull終了文字が追加されます。

あなたのひも、

 char name[]="123";
 char name1[]="1234";

次のようになります:

 char name[]="123\0";
 char name1[]="1234\0";

したがって、サイズは常にプラス1です。ファイルまたは任意のソースから文字列を読み取るときは、文字列を格納する変数に、ヌル終了文字用の余分なスペースが常に必要であることに注意してください。

たとえば、最大サイズが100の文字列を読み取ることが予想される場合、バッファ変数のサイズは101である必要があります。

1
Evdzhan Mustafa

Cの文字列の末尾にヌル文字が付加されているためです。

あなたの場合はここのように

name[0] = '1'
name[1] = '2'
name[2] = '3'
name[3] = '\0'

name1[0] = '1'
name1[1] = '2'
name1[2] = '3'
name1[3] = '4'
name1[4] = '\0'
1
Benison Sam

すべての文字列は、長さに1を追加するchar nullbyte '\ 0'で終了します。

0
Victor de Quidt