我在初始化节点值时遇到问题,以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已停止工作
由于
答案 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将看到它。