2015-08-02 2 views
0

У меня возникли проблемы при инициализации значение узла переданному указателю на языке C,Struct Pass ссылочной Выпуск

я написал что-то вроде следовать,

#include<stdio.h> 
#include<stdlib.h> 
struct node{ 
    int data; 
    struct node *next; 
}; 

void add(struct node *head, int val){ 
    struct node *n1 = NULL; 
    n1 = (struct node *)malloc(sizeof(struct node)); 
    n1 -> data = val; 
    n1 -> next = NULL; 

    if(head == NULL){ 
     head = n1; 
     printf("Head2 is initialized"); 
     return; 
    } 
} 


int main(){ 
    struct node *ptr = NULL; 
    struct node *temp; 
    add(ptr, 11); 
    printf("\nData = %d", ptr->data); 
    return 0; 
} 

Не могли бы вы сказать мне, что это проблема в этом коде,

Когда я исполняю

printf("\nData = %d", ptr->data); 

система показывает Windows, перестал работать

Благодаря

ответ

4

короткий ответ: если вы хотите, чтобы изменить значение указатель указывает на, вы должны передать указатель на указатель:

void add(struct node **head, int val) { 
    ... 
    if(*head == NULL){ 
     *head = n1 
} 

int main(){ 
    ... 
    add(&ptr, 11) 
    ... 
} 

длинный ответ: когда вы звоните add (ptr, 11) в основном вы передаете адрес памяти и номер. как адрес памяти, так и число передаются по значению. в результате изменения этих переменных являются как локальными

в вашем методе добавления - когда вы назначаете значение head в head = n1, вы изменяете значение своей локальной переменной, указывая на новый адрес памяти. когда ваша функция вернет изменения, исчезнет, ​​поэтому главное никогда не видит назначения, а ptr остается NULL.

если передать указатель на PTR - &ptr, вы пройдете место в памяти, где значение ПТР (который является адресом памяти) проживает в основном, так что, когда вы звоните *head = n1* you write the address of n1` значения в этом месте изменится , и главное это увидит.

см. Также this question

+0

спасибо, сейчас работает. –

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