-1

私はちょうどCの本当に奇妙なバグ/機能(WindowsではGCCがC11に設定されている)に出くわしました。

struct my_struct {
    char my_string[65];
};

void foo (struct my_struct * array1, struct my_struct * array2) {
    array2[0].my_string = array1[0].my_string;
}

int main () {
    struct my_struct array1[60];
    struct my_struct array2[60];
    strcpy(array1[0].my_string, "Hello World!");
    foo(array1, array2);
    printf("%s\n", array2[0].my_string);
    return 0;
}

それをコンパイルしようとすると、

error: incompatible types when assigning to type 'char[65]' from type 'char *'

foo関数内。

なんで?それらはまったく同じ構造とデータ型です。

また、関数を次のように変更すると

array2[0] = array1[0];

できます。しかし、文字列を。として出力する、私が作成している別のプログラムがあります(null)。理由はわかりませんが、もう少し試してみます。エラーを再現するスニペットを作成できたら、別の質問を投稿します。

4

2 に答える 2

1

課題で

array2[0].my_string = array1[0].my_string;

は、配列の最初の要素へのポインタであるにchar[65] array1[0].my_string変換されます。char*それがincompatible type発生する方法です。

一般的に、とにかく配列に割り当てることはできないので、それは機能しません。全体structを割り当てるか、配列の内容をコピーします。

于 2012-10-28T20:09:13.263 に答える
1

エラーメッセージは紛らわしいですが、発生している基本的な問題は、配列がCのファーストクラスタイプではないことです。配列を宣言することはできますが、実際には直接何もできません。

式で配列を使用しようとすると、(サイレントに)配列の最初の(または必要に応じて0番目の)要素への匿名ポインターに変換されます。このポインタは割り当てることができず、逆参照することしかできません。

つまり、と言うときarray2[0].my_string = array1[0].my_string;は、同じタイプのように見えても、割り当てることができないものに割り当てようとしています。のようなエラーが発生するのとほぼ同じ方法ですが3 = 5;、その場合は、おそらくより明確なエラーメッセージが表示されます。

于 2012-10-28T20:12:00.260 に答える