1

重複の可能性:
Cのchars[]とchar*sの違いは何ですか?
Cのポインタと文字列に関する質問

私はCの文字列について読んでいて、混乱しています。文字列を「宣言」するには、次の2つの方法があります。

char *str = "This is string";
char str2[20] = "This is string"; 

2つの宣言の違いは何ですか?いつchar str2[20]よりも優先されchar *strますか?

4

5 に答える 5

2

Cでは、文字列はcharsのシーケンスとして表され、NULL文字(別名0、'\0')が付いています。それらはメモリに保存され、それを参照する方法で作業します。char *これを参照する2つの方法、シーケンスへのポインタであるacharsと、実際の変数としてのcharの直接の文字列である配列を特定しました。文字列「abc」は、文字列の終わりを表す追加のNULL文字がある限り、4バイトの長さであることに注意してください。

これに加えて、実際には例で文字列を割り当てています。これには、コンパイル時に指定される文字列も含まれます。

だから2つの質問。1つ目は、文字列の表現方法(char *vs char[])についてです。2つ目は、コンパイル時の文字列についてです。

あなたの例に来るために:

最初のものは、プログラムのテキストとそれへのポインタに定数文字列を作成します。コンパイラによっては、どこにでも保存できます。これはmallocing、メモリの内容を変更してはならないことを除いて、文字列とそれへのポインタを格納することと同等です。これはであるため、別の文字列や例2で定義した配列の先頭など、char *別の場所を指すようにポインタを変更できます。malloced

2つ目は、char配列(文字列を表す方法)を作成します。関数の期間中、配列はスタックに格納および割り当てられ、内容を変更できます。ポインタではないため、別の文字列を指すように変更することはできません。

于 2012-08-25T12:02:44.273 に答える
1
char *str = "This is string";

プログラムのに文字列をconstant data section (also known as .rdata)入れます。このデータは変更できません。

char str2[20] = "This is string";

このタイプの宣言では、で宣言されている場合は、およびで宣言さstored in the stack areaれている場合、データはプログラムのものであることが好ましい。このデータは変更可能である。function scopedata sectionglobal scope

したがって、データを変更する必要がある場合は、2番目のアプローチを使用してください。

于 2012-08-25T12:17:20.823 に答える
0

Cには文字列がありません。そこにあるのはchar配列だけです。また、Cの配列は、最初の要素への単なるポインターです。

それを行う最も簡単な方法は、実際には最初のバリアントです。リテラルの配列の明示的な長さを指定しないと、誤って次のようなことをするのを防ぐことができます。

char[3] = "abc";
于 2012-08-25T12:03:31.590 に答える
0

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を使用します。

よろしく

于 2012-08-25T12:17:14.927 に答える
0

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
于 2012-08-25T13:27:29.850 に答える