1. ホーム
  2. c

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

2022-01-28 20:24:45

質問

私はC言語プログラマーの初心者です。昨日、C言語の構造体の使い方と、特定の問題の解決に関する構造体の応用の可能性について学びました。しかし、Cプログラミングのこの側面を学ぶために、私のC IDE (Codeblocks 16.01) で実験していたとき、私は奇妙な問題に遭遇しました。コードは以下のようなものです。

#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: 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 章で述べたように、初期化の法則に従ったものです。

中括弧で囲まれた各イニシャライザーリストは、関連するカレントオブジェクトを持ちます。何も 指定がない場合、現在のオブジェクトのサブオブジェクトは、次の順序で初期化されます。 配列の要素は添え字の多い順に、構造体の要素は添え字の少ない順に。 のメンバー(宣言順)、およびユニオンの最初の名前の付いたメンバーです。