0

以下のコードでは、

char strArr[5][20];
int i;

for(i=0; i<5; i++)  
{  
   printf("string %d: ", i+1);  
   gets(strArr[i]);  
}

strArr[0]=strArr[1]; //have an compile error on this line. Why cannot assign?

上記のコード ブロックの最後の行でコメントしたように、コンパイル エラー (互換性のない型) があるのはなぜですか? 左オペランドと右オペランドの両方が char* 型ですか?

4

3 に答える 3

4

左オペランドと右オペランドの両方がchar[20]ではなく型char*です。変数には、実際にはそれらのために予約されたストレージがあり、単なる文字列へのポインターではありません。したがって、割り当てが正当である場合、ある配列から別の配列に 20 文字をコピーすることになります。

C では、代入演算子を使用して配列をコピーできません。strcpystrncpy、またはmemcpyを代わりに使用します。

(エラーの特定の言い回しは、配列がいくつかの場所でポインターに崩壊するためであると思われます。代入の右側で使用されている間、代入の左側はそれらの場所の1つではないことが予想されます。)

于 2012-07-08T05:39:13.720 に答える
2

char Array[n][m]: ほとんどすべての言語で、配列の配列を意味します。したがって、Array[0] Array[1].... は配列です。実際には、各要素の連続メモリへのポインタ ポイントです。

この配列の型は :char[m]です。そして、 : と書くとarrayX = arrayY、arrayY のすべての値を arrayX にコピーしたいのですが、C ではこれが許可されていません。手でコピーする必要があります:

for(int i=0; i<=sizeof(arrayX)/sizeof(char); i++)
      arrayX[i] = arrayY[i];

よく使う memcpyのですが、背景は上記のコードをベースにしています。

 memcpy (strArray[1],strArray[0],sizeof(strArr[0]));

しかし、次のように宣言すると、コンパイル エラーは発生しません。

char * strArray[5][10];

ポインタの値をコピーするだけなので、このポインタが指す場所のコピーを意味します。しかしもちろん、それはあなたのコードを大きく変えます。より明確にするためにここに描いています。

この助けを願っています:)

于 2012-07-08T06:05:48.317 に答える
1

文字配列 strArray[0] のベース アドレスを strArray[1] のベース アドレスに変更しようとしていますが、これは許可されていません。したがって、エラーが発生しています。

于 2012-07-09T07:54:55.190 に答える