Как изменить переменные указателя в структуре?
Поэтому я пытаюсь реализовать связанный список, и у меня есть эта структура для каждого из узлов:
typedef struct listNode {
struct listNode *next;
void *data;
} NODE;
Ранее я сделал игру, в которой структура космического корабля выглядела так:
typedef struct {
int height;
int width;
} SPACECRAFT;
и я мог бы сделать новый космический корабль, выполнив
SPACECRAFT plyrShip = {
.width = //someInt;
.height = //someInt;
};
Хотя с узлами переменные являются указателями, и это не позволяет мне создать новый узел, выполнив
NODE newNode = {
.*next = null;
.*data = *data //function has *data as parameter so I can pass it
//into the node
}
Что я делаю неправильно?
2 ответа
Вы связали синтаксис объявления указателя и назначенный синтаксис инициализатора. Поле члена может быть объявлено как тип указателя. При использовании назначенных инициализаторов просто назовите поле. Также обратите внимание, что они разделены запятыми.
NODE newNode = {
.next = null,
.data = data
};
Официально это называется Designated Initializer, который был представлен с C99.
Во-первых, вы должны реализовать типы указателей. struct listNode next;
это объявить переменную, next
чей тип struct listNode
, struct listNode *next
это объявить переменную, next
тип которого является типом, который указывает на значение, тип которого struct listNode
, Таким образом, вы должны сделать это так.
NODE newNode = {
.next = null,
.data = data
}
Более того, так выглядит структура памяти. Вы могли бы помнить это, чтобы устранить путаницу. И это ясно указывает на то, почему вы не могли этого сделать. (следующий элемент в структуре не может быть разыменован индивидуально из-за структуры структуры здесь).
|--------------|
| newNode.next | &newNode
|--------------|
| newNode.data |
|--------------|
Обновленный ответ: проверьте редактирование резюме.