私はCの文字列について読んでいて、混乱しています。文字列を「宣言」するには、次の2つの方法があります。
char *str = "This is string";
char str2[20] = "This is string";
2つの宣言の違いは何ですか?いつchar str2[20]
よりも優先されchar *str
ますか?
私はCの文字列について読んでいて、混乱しています。文字列を「宣言」するには、次の2つの方法があります。
char *str = "This is string";
char str2[20] = "This is string";
2つの宣言の違いは何ですか?いつchar str2[20]
よりも優先されchar *str
ますか?
Cでは、文字列はchar
sのシーケンスとして表され、NULL文字(別名0、'\0'
)が付いています。それらはメモリに保存され、それを参照する方法で作業します。char *
これを参照する2つの方法、シーケンスへのポインタであるachars
と、実際の変数としてのcharの直接の文字列である配列を特定しました。文字列「abc」は、文字列の終わりを表す追加のNULL文字がある限り、4バイトの長さであることに注意してください。
これに加えて、実際には例で文字列を割り当てています。これには、コンパイル時に指定される文字列も含まれます。
だから2つの質問。1つ目は、文字列の表現方法(char *
vs char[]
)についてです。2つ目は、コンパイル時の文字列についてです。
あなたの例に来るために:
最初のものは、プログラムのテキストとそれへのポインタに定数文字列を作成します。コンパイラによっては、どこにでも保存できます。これはmallocing
、メモリの内容を変更してはならないことを除いて、文字列とそれへのポインタを格納することと同等です。これはであるため、別の文字列や例2で定義した配列の先頭など、char *
別の場所を指すようにポインタを変更できます。malloced
2つ目は、char配列(文字列を表す方法)を作成します。関数の期間中、配列はスタックに格納および割り当てられ、内容を変更できます。ポインタではないため、別の文字列を指すように変更することはできません。
char *str = "This is string";
プログラムのに文字列をconstant data section (also known as .rdata)
入れます。このデータは変更できません。
char str2[20] = "This is string";
このタイプの宣言では、で宣言されている場合は、およびで宣言さstored in the stack area
れている場合、データはプログラムのものであることが好ましい。このデータは変更可能である。function scope
data section
global scope
したがって、データを変更する必要がある場合は、2番目のアプローチを使用してください。
Cには文字列がありません。そこにあるのはchar
配列だけです。また、Cの配列は、最初の要素への単なるポインターです。
それを行う最も簡単な方法は、実際には最初のバリアントです。リテラルの配列の明示的な長さを指定しないと、誤って次のようなことをするのを防ぐことができます。
char[3] = "abc";
C文字列はメモリ内で一定であるため、次のようになります。
char *str = "This is string";
「これは文字列です」をメモリに格納し、変更できません。strに割り当てることができるのは別のアドレスのみです。
でも
char str2[20] = "This si string";
の省略形です
char String2[20]={'T','h','i','s',' ','s','i',' ','s','t','r','i','n','g','\0'};
文字列をメモリに格納せず、独立したバイトを格納します。
メッセージのような定数文字列を使用する場合は、最初の行を使用します。ワードプロセッサのように文字列を使用および操作する場合は、secondを使用します。
よろしく
char *str = "This is string";
-これにより、文字列が読み取り専用データとしてテキストセグメントに保持され、アドレスがローカルポインタ変数に格納されますstr
。
str[0] = 'a'; //This will leads to crash, because strings are in read only segment.
printf("%d",sizeof(str)); //This will print 4(in 32bit m/c) or 8(in 64 bit m/c)
char str2[20] = "This is string";
-これにより、文字列が文字配列としてローカルスタックに保持されます。
str2[0] = 'a'; //This will change the first character to a
printf("%d",sizeof(str2)); //This will print 20