C 为什么我的链表标题指向标题前的两个项目
所以我试着用非全局形式来练习我的C双指针链表,我弄不明白为什么s——实际上是头——首先指向null,然后指向某个随机地址,尽管我想我把它移动到了链表中的第一个节点 这是我的密码:C 为什么我的链表标题指向标题前的两个项目,c,pointers,linked-list,singly-linked-list,double-pointer,C,Pointers,Linked List,Singly Linked List,Double Pointer,所以我试着用非全局形式来练习我的C双指针链表,我弄不明白为什么s——实际上是头——首先指向null,然后指向某个随机地址,尽管我想我把它移动到了链表中的第一个节点 这是我的密码: typedef struct nodeStruct{ int item; struct nodeStruct *next; } Statistician; void add(Statistician **s, int x); void displayData(Statist
typedef struct nodeStruct{
int item;
struct nodeStruct *next;
} Statistician;
void add(Statistician **s, int x);
void displayData(Statistician **s);
int main(int argc, char *argv[]) {
Statistician *s = NULL;
add(&s, 3);
add(&s, 4);
add(&s, 5);
add(&s, 6);
add(&s, 7);
add(&s, 8);
add(&s, 9);
displayData(&s);
return 0;
}
void add(Statistician **s, int x){
Statistician *temp = malloc(sizeof(Statistician));
temp->item = x;
temp->next = NULL;
if(s == NULL){
s = &temp;
}
else{
Statistician *travel = s;
while(travel->next!=NULL){
travel = travel->next;
}
travel->next = temp;
}
}
void displayData(Statistician **s){
Statistician *temp = s;
printf("List is: ");
while(temp!=NULL){
printf("%d ", temp->item);
temp = temp->next;
}
}
我从我的代码中得到这个输出,我还得到以下警告:
列表为:0 435864803 4 5 6 7 8 9
[警告]在此代码行从不兼容的指针类型[默认启用]初始化
统计员*旅行=s
我总是可以在打印数据之前移动显示数据两次,这样我不想看到的第一个数据就不会消失,但我想知道为什么它会这样工作。我也可以忽略这些错误,但我想学习如何修复它。代码的逻辑错误。您没有正确使用
s
。大概是这样。你之前的行动没有做任何重要的事情。您对局部变量进行了一些错误的更改,并将单指针值指定给了双指针
void add(Statistician **s, int x){
Statistician *temp = malloc(sizeof(Statistician));
temp->item = x;
temp->next = NULL;
if(*s == NULL){
*s = temp; //<---change
}
else{
Statistician *travel = *s; //<--change
while(travel->next!=NULL){
travel = travel->next;
}
travel->next = temp;
}
}
之前,您访问内存时有未定义的行为,您甚至没有分配内存,或者您没有访问内存的权限。这在代码中调用了未定义的行为
理清思路:
这里,当您传递
&s
时,这意味着正在发送s
的地址,类型为统计学家**
的局部变量将保存该地址。现在,如果您不取消引用它,那么您只需使用包含在局部变量中的s
的地址。这不是你想要的。您需要更改正在传递的地址。因此,您可以通过取消对它的引用来执行此操作。代码的逻辑错误。您没有正确使用s
。大概是这样。你之前的行动没有做任何重要的事情。您对局部变量进行了一些错误的更改,并将单指针值指定给了双指针
void add(Statistician **s, int x){
Statistician *temp = malloc(sizeof(Statistician));
temp->item = x;
temp->next = NULL;
if(*s == NULL){
*s = temp; //<---change
}
else{
Statistician *travel = *s; //<--change
while(travel->next!=NULL){
travel = travel->next;
}
travel->next = temp;
}
}
之前,您访问内存时有未定义的行为,您甚至没有分配内存,或者您没有访问内存的权限。这在代码中调用了未定义的行为
理清思路:
这里,当您传递&s
时,这意味着正在发送s
的地址,类型为统计学家**
的局部变量将保存该地址。现在,如果您不取消引用它,那么您只需使用包含在局部变量中的s
的地址。这不是你想要的。您需要更改正在传递的地址。因此,您可以通过取消对它的引用来执行此操作
[警告]在这行代码处从不兼容的指针类型[默认启用]初始化统计员*行程=s
这表示您正在分配不兼容的指针类型
if(s == NULL){
s = &temp;
}
这里的s
不是指向你的头部
,*s
是。
应该如此
if(*s == NULL){
*s = temp;
}
Statistician *travel = *s;
然后
应该是这样的
if(*s == NULL){
*s = temp;
}
Statistician *travel = *s;
然后在displayData()
[警告]在这行代码处从不兼容的指针类型[默认启用]初始化统计员*行程=s
这表示您正在分配不兼容的指针类型
if(s == NULL){
s = &temp;
}
这里的s
不是指向你的头部
,*s
是。
应该如此
if(*s == NULL){
*s = temp;
}
Statistician *travel = *s;
然后
应该是这样的
if(*s == NULL){
*s = temp;
}
Statistician *travel = *s;
然后在displayData()