Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我的链表标题指向标题前的两个项目_C_Pointers_Linked List_Singly Linked List_Double Pointer - Fatal编程技术网

C 为什么我的链表标题指向标题前的两个项目

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

所以我试着用非全局形式来练习我的C双指针链表,我弄不明白为什么s——实际上是头——首先指向null,然后指向某个随机地址,尽管我想我把它移动到了链表中的第一个节点

这是我的密码:

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()