3

これが私のコードです。このコードの出力を明確にする必要があります。

#include <stdio.h>
int main(void )
{
char name1[10] = "Rajan" , name2[10] = "Rajan" ;
char *name3 = "Chennai" , *name4 = "Chennai" ;
printf("\nAddress for name1 and name2 : %p and %p",name1,name2) ;
printf("\nAddress for name3 and name4 : %p and %p",name3,name4) ;
return 0 ;
}

このコードの出力は

Address for name1 and name2 : 0x7fff9e6cbe10 and 0x7fff9e6cbe20
Address for name3 and name4 : 0x400760 and 0x400760

ここで、値のアドレスと は、name12name2つの異なる配列を割り当てたため、異なります。しかし、 と の場合name3name4アドレスは同じなのになぜ変わらないのでしょうか? 別のメモリを作成せず、値に名前を割り当てませChennaiんか? なぜ同じメモリを指しているのですか?

4

6 に答える 6

5

標準では次のことが許可されています。

6.4.5 - 7

これらの配列の要素が適切な値を持っている場合、これらの配列が異なるかどうかは指定されていません。プログラムがそのような配列を変更しようとした場合の動作は未定義です。

つまり、変更しない限り問題ないはずですよね?

于 2012-11-30T08:37:47.517 に答える
0

「チェンナイ」はconstであり、name3とname4は同じ場所を指します。

于 2012-11-30T08:40:44.663 に答える
0

プログラムがコンパイルされると、コンパイラはオブジェクト コード ファイルを作成します。このファイルには、マシン コードと、プログラムで宣言されたすべての文字列定数のテーブルが含まれます。

声明
char *name3= "Chennai";

name3 が文字列定数テーブル内の文字列 "Chennai" のアドレスを指すようにします。同じことが name4 にも当てはまります。したがって、name3 と name4 の両方が同じアドレスを指します。

この文字列は文字列定数テーブルにあり、技術的には実行可能コードの一部であるため、変更することはできません。それを参照して、読み取り専用で使用することしかできません。

http://euklid.mi.uni-koeln.de/c/mirror/mickey.lcsc.edu/%257Esteve/c13.htmlは、C で文字列がどのように処理されるかについての詳細を示しています。

于 2012-11-30T09:15:57.557 に答える
0

name3 と name4 は文字列リテラルであり、読み取り専用メモリに格納され、文字列リテラルの各文字を変更することはできません。両方のポインタに同じ文字を格納しようとしているため、メモリ割り当てを最適化するために、文字列「chennai」は読み取り専用アドレスで一度だけメモリを取得し、name3 と name4 は同じアドレスを指します。name1 と name2 のすべての文字を変更できるため、両方に異なるアドレスが与えられます

于 2012-12-04T10:16:40.710 に答える
0

const メモリへの char* であるためです。name3 または name4 が指す文字列は変更できませんが、name1 と name2 が指す文字列は変更できます。これは、name1 と name2 がメモリを割り当ててから、名前「Rajan」をそのメモリに初期化するためです。

name3 または name4 が別のものを指すようにすることもできます。しかし、現時点では、それを const 文字列を指すように言っています (そして、それらの const 文字列を複製するつもりはありません.... name1 を初期化するために使用する "Rajan" に別の const 文字列を格納することもわかります。と name2

于 2012-11-30T08:38:30.820 に答える
0

文字列リテラルは、常に変更不可能であることを意図していました。ある文字列リテラル オブジェクトは別の文字列リテラル オブジェクトを変更しても変更できないため、それらは変更できないため、スペースを共有しても害はありません。

ただし、このconst属性はもともと C には存在しなかったため、言語では、文字列リテラルへのポインターをプレーンな (非 const) ポインターに割り当てることができるようにする必要がありました。古いコードとの互換性を維持するために、C 標準では文字列リテラルを非 const ポインターに割り当てることを引き続き許可しています。ただし、それらを変更しようとしてはなりません。

C が新たに再作成された場合、文字列リテラルはconst属性を持つポインターを生成する可能性があります。

(配列の初期化に使用される文字列リテラルは特殊です。文字列リテラルは基本的に、配列に何を入れるかをコンパイル時に指定するだけです。ポインタに割り当てることができるアドレスはありません。)

于 2012-11-30T11:00:10.940 に答える