2015-03-22 2 views
-1

Я не могу понять этот 3-строчный код, используемый для реализации статический связанный список. Это на самом деле ответ на этот вопрос question.Как этот код действительно работает?

Я отправляю код здесь снова- (основное действие в основном вторая линия)

struct node {int x; struct node *next;}; 
#define cons(x,next) (struct node[]){{x,next}} 
struct node *head = cons(1, cons(2, cons(3, cons(4, NULL)))); 

Мой вопрос - какова функциональность этого заявления? (struct node[]){{x,next}}. Является ли это инструкцией инициализации и что она возвращает, что она может быть назначена на struct node*?

ответ

1

(struct node[]){{x,next}} - это сложный литерал, и он инициализирует указатель struct *node.

+------+------+  +------+------+  +------+------+  +------+------+ 
|  |  |  |  |  |  |  |  |  |  |  | 
| 1 | next +---->| 2 | next +---->| 3 | next +---->| 4 | NULL | 
|  |  |  |  |  |  |  |  |  |  |  | 
+------+------+  +------+------+  +------+------+  +------+------+ 
^
    | 
    head 
+0

Его можно записать как '#define cons (x, next) (struct node *) {x, next}', почему он использовал дополнительную скобку? вероятно, избыточный. – coderredoc

+0

И память выделяется из памяти стека не из кучи, поскольку динамическое распределение не используется. – coderredoc

+1

Нет отливки. Он может выглядеть как один, но '() {}' - просто оператор составного литерала. – cremno

Смежные вопросы