2010-12-21 3 views
1

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

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; 
} 

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

ответ

10
struct node *root; 
root->x = 42; 

Вы разыскиваете неинициализированный указатель. Для того, чтобы выделить память для узла:

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

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

struct node root; 
root.x = 42; 
+0

Так что я должен префикс его с какой-то инициализацией? struct node * root = new (struct node); или что-то? – socks

+1

В этом конкретном случае я бы назвал «корневой узел узла» вместо указателя, а затем использовал 'root.x' и передал' & root' функции, которые ожидают указателя. Не всегда оправданно динамическое хранилище. –

-1

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

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

Кроме того, перед Return 0 линия добавить

free(root); 
1

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

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