1. ホーム
  2. スクリプト・コラム
  3. その他

[解決済み】構造体フィールドを代入すると「error: 式への代入で配列型エラーが発生しました」(C言語)

2022-01-16 19:01:52

質問

簡単なC言語プログラミングを書いています。コードは以下の通りです。

#include <stdio.h>

#define N 30

typedef struct{
     char name[N];
     char surname[N];
     int age;
} data;

int main() {
     data s1;
     s1.name="Paolo";
     s1.surname = "Rossi";
     s1.age = 19;
     getchar();
     return 0;
}

コンパイルすると(WindowsのGCC 4.9.3-1)、エラーが発生します。

"error: assignment to expression with array type error"

命令で

s1.name="Paolo" 
s1.surname="Rossi" 

をする間に

data s1 = {"Paolo", "Rossi", 19};

が動作します。 

解決方法は?

での問題に直面しています。

 s1.name="Paolo";

というのも,LHSで 配列 型であり、これは 割り当て可能 .

さらに詳しく説明すると C11 章6.5.16

代入演算子は、左オペランドとして変更可能な lvalue を持たなければならない。

であり、また 変更可能な lvalue 章6.3.2.1より

変更可能なlvalueとは、配列型を持たないlvalueのことです[...]。

を使用する必要があります。 strcpy() から にコピーします。 という配列になります。

それはそうと。 data s1 = {"Paolo", "Rossi", 19}; は問題なく動作します。なぜなら、これは直接 代入 には、代入演算子が含まれます。そこでは 中括弧で囲まれたイニシャライザーリスト の初期値を提供する。 オブジェクト . これは、§6.7.9 章で述べたように、初期化の法則に従ったものです。

中括弧で囲まれた各イニシャライザーリストには、関連する現在のオブジェクトがあります。指定がない場合、カレントオブジェクトのサブオブジェクトは、カレントオブジェクトの型に従った順序で初期化されます:配列要素は添え字の増加順、構造体メンバーは宣言順、ユニオンの最初の名前付きメンバーです[......]。