结构通过引用传递问题

时间:2015-08-02 07:49:52

标签: c

我在初始化节点值时遇到问题,以C语言传递指针,

我写了类似跟随的内容,

#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已停止工作

由于

1 个答案:

答案 0 :(得分:4)

简短回答:如果要更改指针指向的值,则必须将指针传递给指针:

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

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

答案很长:当你在main中调用add(ptr,11)时,你会传递一个内存地址和一个数字。内存地址和数字都按值传递。因此,对这些变量的更改都是本地的

在你的add方法中

- 当你为head = n1中的head赋值时,你将局部变量的值改为指向一个新的内存地址。当你的函数返回时,更改已经消失,因此main永远不会看到赋值,ptr仍为NULL。

如果您将指针传递给ptr - &ptr,您将在内存中传递一个位置,其中ptr(即内存地址)的值位于main中,因此当您调用*head = n1* you write the address of n1时此位置的值将更改,main将看到它。

另见this question