内联实现和函数调用在C中显示了两种不同的行为?

内联实现和函数调用在C中显示了两种不同的行为?,c,function,pointers,data-structures,linked-list,C,Function,Pointers,Data Structures,Linked List,我一直在尝试实现单链表的删除功能 我的实现如下 typedef struct singly_linked_list{ int data; struct singly_linked_list *next; }sll; 删除第一个节点的功能如下: void delete_node_from_front(sll ** head){ sll ** temp; *temp = *head; (*head) = (*head)->next; (*tem

我一直在尝试实现单链表的删除功能

我的实现如下

typedef struct singly_linked_list{
    int data;
    struct singly_linked_list *next;
}sll;
删除第一个节点的功能如下:

void delete_node_from_front(sll ** head){
    sll ** temp;
    *temp = *head;
    (*head) = (*head)->next;
    (*temp)->next = NULL;
    free_node(temp);
}
我调用此函数的另一个函数:

void delete_node_from_given_pos(sll ** head, int pos){
    int i = 1;
    sll * temp;
    sll * prev;
    temp = *head;
    prev = *head;
    if(pos == 1){
        delete_node_from_front(head);
    }
    else{
        while(temp != NULL && i < pos){
            i++;
            prev = temp;
            temp = temp->next;
        }
        if(temp != NULL){
            prev->next = temp->next;
            temp->next = NULL;
            free_node(&temp);
        }
        else{
            printf("Node with given position is not present");
        }
    }
}
void free_node(sll ** head){
    free(*head);
}
程序运行良好。我称之为功能的方式:

sll * head;
head = NULL;
int arr[_SIZE]=_ELEMENT;
create_list(&head, arr, _SIZE);
delete_node_from_given_pos(&head, 1);
print_list(head);
打印列表功能的实现

自由_节点功能的实现:

void delete_node_from_given_pos(sll ** head, int pos){
    int i = 1;
    sll * temp;
    sll * prev;
    temp = *head;
    prev = *head;
    if(pos == 1){
        delete_node_from_front(head);
    }
    else{
        while(temp != NULL && i < pos){
            i++;
            prev = temp;
            temp = temp->next;
        }
        if(temp != NULL){
            prev->next = temp->next;
            temp->next = NULL;
            free_node(&temp);
        }
        else{
            printf("Node with given position is not present");
        }
    }
}
void free_node(sll ** head){
    free(*head);
}

此行为的可能原因是什么?

您的“从前端删除节点”功能显示未定义的行为;temp指向哪里?@OliverCharlesworth链接列表的标题。初始化*temp=*头是否错误??那么正确的方法是什么?*temp=*head;这是错误的。temp未初始化*温度=*水头;应为sll*温度=*压头;在使用“指针”和“指针指向指针”时,它可以帮助我拿一张纸,在malloced内存、箭头下一个指针和命名箭头指针变量中绘制框。所以ssl**temp将绘制为一个框,一个ssl,一个指向带有未命名变量或命名*temp的框的箭头,另一个箭头指向带有标签temp的未命名变量。这表明:如果你需要这个构造,你需要为这个未命名的*temp调用malloc内存。