Как я могу объявить структуру указателя, используя {}? - PullRequest
4 голосов
/ 27 апреля 2010

Это, наверное, один из самых простых вопросов в языке программирования C ...

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

typedef struct node
{
  int data;
  struct node * after;
  struct node * before;
}node;

struct node head = {10,&head,&head};

Есть ли способ заставить head быть * head [сделать его указателем] и при этом иметь возможность использовать '{}' [{10, & head, & head}] для объявления экземпляра head и при этом оставить это в глобальном масштабе?

Например:

 //not legal!!!
 struct node *head = {10,&head,&head};

Ответы [ 2 ]

7 голосов
/ 27 апреля 2010

Решение 1:

#include <stdlib.h>
#include <stdio.h>


typedef struct node
{
  int data;
  struct node * after;
  struct node * before;
}node;
int main() {

    struct node* head = (struct node *)malloc(sizeof(struct node)); //allocate memory
    *head = (struct node){10,head,head}; //cast to struct node

    printf("%d", head->data);

}

Что-то столь же простое, как struct node *head = {10, head, head} не будет работать, потому что вы не выделили память для структуры (int и два указателя).

Решение 2:

#include <stdlib.h>
#include <stdio.h>


typedef struct node
{
  int data;
  struct node * after;
  struct node * before;
}node;
int main() {

    struct node* head = &(struct node){10,head,head};

    printf("%d", head->data);

}

Это выйдет за рамки - Решение 1 является превосходным по этой причине, и, поскольку вы создаете связанный список, я думаю, вам нужно выделенная память кучи - не выделен стек.

0 голосов
/ 27 апреля 2010

Вы можете сделать указатель головой, но вам нужно будет инициализировать его в функции.

struct node head_node;
struct node *head = &head_node;

void
initialize() {
    *head = {10,&head_node,&head_node};
}

Нет способа инициализировать ptr-заголовок напрямую в глобальной области видимости.

...