Почему этот простой привет код мира segfaulting? - PullRequest
1 голос
/ 22 декабря 2010

Извините начальный уровень этого вопроса. У меня есть следующий простой код, но он не запускается. Получается ошибка сегментации. Если я заменю указатель простым вызовом фактической переменной, он работает нормально ... Я не уверен, почему.

struct node
{
 int x;
 struct node *left;
 struct node *right;
};

int main()
{
 struct node *root;
 root->x = 42;
 printf("Hello world. %d", root->x);
 getchar();
 return 0;
}

Что не так с этим кодом?

Ответы [ 3 ]

10 голосов
/ 22 декабря 2010
struct node *root;
root->x = 42;

Вы разыменовываете неинициализированный указатель. Чтобы выделить хранилище для узла:

struct node *root = malloc(sizeof(struct node));

Вы также можете выделить узел в стеке:

struct node root;
root.x = 42;
1 голос
/ 22 декабря 2010

Чтобы использовать указатель для доступа к чему-либо, указатель должен указывать на это что-то. Чтобы указатель указывал на что-то, это что-то должно существовать. Создание указателя не создает ничего, на что он может указывать. Вы должны сделать это явно, либо с помощью динамического выделения (malloc()), выделения стека (т.е. локальной переменной), либо путем указания на то, что уже существует (например, экземпляр static, такой как глобальное; в качестве параметра; и т. д.).

0 голосов
/ 22 декабря 2010

После строки struct node *root; добавьте

root = (sturct node*) malloc(sizeof(struct node));

Также перед строкой Return 0 добавьте

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