C struct и объединение - PullRequest
       1

C struct и объединение

0 голосов
/ 02 марта 2019

У меня есть следующий код.

struct Node {
  struct Node *next;
  char type[12];
  union {
    struct A *a;
  };
};

int main() {
  char *x[6];
  x[1] = "a";
  x[2] = "bc";
  x[3] = "bf";
  x[4] = "bd";
  x[5] = "ab";
  x[6] = "b";

  struct Node *new = (struct Node*) malloc(sizeof(struct Node));

  struct A*a = (struct A*) malloc(sizeof(struct A));
  *a->a = x[1];
  *a->b = x[2];
  *a->c = x[3];
  *a->d = x[4];
  new.a = a;
}

Я пытаюсь присвоить значение каждому свойству a, но постоянно получаю ошибки следующим образом.

struct or union expected at  //*a->c= x[3];//

Я такжепробовал это

*a.c= x[3];
 a.c = x[3]

Как исправить эту ошибку?

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Следующие причины вызывают ошибки компилятора в коде, показанном в вопросе:

  • Использование sizeof(struct A) в то время как struct A не определено полностью.
  • Использование a->a, a->b, a->c и a->d, в то время как struct A не полностью определено.
  • Использование new.a, поскольку new объявлен указателем в struct Node *new.

Последнее из них может привести к сообщению об ошибке, указанному в вопросе, о том, что ожидается структура или объединение.Строка, в которой вопрос задает это сообщение, a->c= x[3];, не должна, так как ни один оператор, ожидающий структуру или объединение, не используется в этом операторе, кроме ->, который правильно получает указатель на структуру (хотя и не полностью определенную).

Поэтому я подозреваю, что в вопросе был неверно указан код получения сообщения или местоположение сообщения.

Кроме того, char *x[6]; … x[6] = "b"; неверно;когда массив определен с [6[, его действительные индексы имеют значение от 0 до 5, а не 6.

0 голосов
/ 02 марта 2019

Выражение *a->c равно *(a->c).То есть вы пытаетесь разыменовать элемент c.

Ошибка, которую вы получаете, заключается в том, что a->c не является указателем или массивом.Вы не можете использовать оператор разыменования для чего-то, что не является указателем или массивом.

Вы должны получить ту же ошибку при попытке разыменования a->d.

Вы, вероятно, не должныиспользуйте разыменование здесь вообще (т.е. вы просто удалите звездочку).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...