2016-08-29 6 views
0

Я написал программу на C. Какая-то часть кода, который находится внутри функции выглядит следующим образом:Почему я не могу инициализировать и объявлять указатель на указатель на NULL в C?

struct node* functionName(struct node *currentFirstPointer){ 
    struct node **head = NULL; 
    *head = currentFirstPointer; 
    return *head; 
} 

Здесь node является структурой. Но эта строка дает мне segmentation fault, когда я запускаю программу. Но если я объявляю и инициализирую указатель на указатель в отдельных операторах внутри той же функции, что и ниже, тогда он отлично работает.

struct node* functionName(struct node *currentFirstPointer){ 
    struct node **head; 
    *head = NULL; 
    *head = currentFirstPointer; 
    return *head; 
} 

Возможно, причина в том, что 1-й блок не работает, а 2-й блок работает нормально?

+1

Вы хотите создать [___MCVE___] (http://stackoverflow.com/help/mcve)? –

+2

Вы уверены, что первый пример работает, а второй - нет? Потому что это не имеет никакого смысла. Разве ты не имел в виду наоборот? Если первый пример вызывает ошибку seg, проблема не в отправленном коде. – Lundin

+0

Я понимаю, что это неопределенное поведение в вашем случае, но можете ли вы рассказать мне, какой компилятор вы используете для этого, потому что я не могу воспроизвести это в Visual Studio. –

ответ

2

У вас есть два примера разыменования указателя.

struct node **head = NULL; 
*head = currentFirstPointer; 

и

struct node **head; 
*head = NULL; 
*head = currentFirstPointer; 

Оба являются причиной для неопределенного поведения. Во-первых, вы разыскиваете указатель NULL. Во втором вы разыскиваете неинициализированный указатель.

Возможно, что второй блок работает, но это проблема с неопределенным поведением.

Прежде чем вы сможете разыменовать указатель, вам необходимо выделить память для head.

struct node **head = malloc(sizeof(*head)*SOME_COUNT); 
*head = currentFirstPointer; 
+1

ОП утверждает, что второй пример работает, а 1-й - нет. – Lundin

+0

@ Lundin, я говорю, что даже второй блок является причиной неопределенного поведения. Возможно, он работает, но это неопределенное поведение. –

+1

Это не объясняет, почему 1-й дает ошибку seg. Вопрос неясен и не может быть дан без дальнейших разъяснений. – Lundin

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

  • Нет связанных вопросов^_^