Влияние на структуру "stati c" в другой структуре в куче - PullRequest
0 голосов
/ 13 июля 2020

Итак, я решил свою проблему, не так уж и сложно, но я блуждаю, почему первая версия не работала. Итак, вот пример моей проблемы:

typedef struct a {
    int i;
}   A;

typedef struct b {
    int i;
    A a;
}   B;

typedef B * PB;

PB create_B(int ia, int ib) {
    PB b = malloc(sizeof(B));
    b->i = ib;
    b->a = {ia};
}

Я получаю сообщение об ошибке от компилятора:

"error: ожидаемое выражение перед '{' token"

в строке: b-> a = {ia};

Но я действительно не понимаю, в чем проблема.

Я решил это преобразованием структуры:

PB create_B(int ia, int ib) {
    PB b = malloc(sizeof(B));
    b->i = ib;
    b->a = (A){ia};
}

а типы четко определены нет? Я имею в виду, что для меня отчасти очевидно, что {ia} имеет тип A, поскольку b-> a также имеет тип A.

Я, вероятно, ошибаюсь в этом последнем высказывании (компилятор, вероятно, прав). Так что, если у вас есть пример, в котором эта ситуация неочевидна и действительно нуждается в приведении, это будет действительно полезно или, по крайней мере, дать объяснение.

Спасибо за ваше время.

Бариот

PS: Я тоже мог бы это сделать, думаю

PB create_B(int ia, int ib) {
    PB b = malloc(sizeof(B));
    *b = (B){ib, {ia}};
}

Но мне все еще нужен гипс ...

1 Ответ

1 голос
/ 13 июля 2020

{ia} не является выражением в C и не может использоваться в выражении.

{ia} является частью синтаксиса определений. В определении список начальных значений может быть указан в фигурных скобках после =. (И фигурные скобки могут быть опущены при инициализации скалярного объекта.) Это специальный синтаксис для инициализации в определении, а не присваивание, подобное использованию = в выражении.

(A){ia} - это выражение ; это конструкция, называемая составным литералом. После имени типа в круглых скобках в фигурных скобках указываются начальные значения. Это создает объект указанного типа. Затем этот объект можно использовать в выражении, например в качестве правого операнда присваивания.

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