2017-05-30 12 views
-3
char txt[20] = "Hello World!\0"; 

上記の定義で何バイト割り当てられていますか? charが1バイトを占めると考えると、intは2バイトです。 最後に"\0が1つだけ存在することに注意してください。 上記の定義が占めている多くのバイトを計算する方法はありますか?char定義に必要なメモリ容量

+0

Ehh? strlen、多分?しかし、null-sの世話をしなければならない。 –

+2

配列 'txt'は内容にかかわらず20バイトを占めます。また、ほとんどすべてのシステム(32ビットと64ビット)では 'int 'は32ビット(4バイト)であり、1980年代後半からこのようになっています。 –

+1

答えはCの本で見つけることができるので、下降します。これは、質問者から解決しようとすることなく、「私の宿題をしてください」というような感じです。 – user694733

答えて

5

ステートメントchar txt[20]="Hello World!\0"は、実際には定義部分と初期化部分の2つの部分で構成されています。 char txt[20]は、後で配列を初期化する内容にかかわらず、文字サイズ(この場合は20バイト)の20要素を予約するようにコンパイラに指示します。初期化部​​は予約メモリを文字「Hello World!\0」の文字で「プリフィル」します。文字列リテラルはそれ自体で\0文字で終了するので、実際には\0を明示的に文字列に書き込む必要はありません。したがって、char txt[20]="Hello World!"と書いてください。文字列リテラルの長さが割り当てられたメモリよりも小さい場合は問題ありません。初期化に使用される文字列リテラルの長さが配列の長さを超える場合は、少なくともコンパイラ警告を受け取ります。

ただし、char txt[]="Hello World!"と書くと、予約されているメモリの長さはまさに最初の文字列リテラルの長さになります。

アレイの初期化については、cppreference.comとすることができます。 「変数定義」と「変数宣言」の対比については、SO answerが非常に役に立ちます。

+1

変数*定義*の部分を忘れないでください。 –

+0

変数定義ですか?何? @Someprogrammerdude – tilz0R

+0

@ tilz0R変数は*宣言され*定義されている必要があります。宣言は、変数が持つ型とその名前をコンパイラに伝えます。定義は、変数に実際に領域を割り当てるようにコンパイラに指示するものです。ほとんどの変数宣言も(質問のように)定義されていますが、2つを区別することは可能です。 –

1

Cの二重引用符の中に入るものは、最後にヌル終了文字列と見なされます。最後に\ 0を追加する必要はありません。

strlen(arr)+1を使用すると、charのサイズを取得できます。 strlenはヌル終了をカウントしないため、ここで+1します。

関連する問題