C中函数返回的指针



下面是创建一个有两个指针的链表的代码。链表正在被创建(打印),所有指针(prev + next)都很好。但是,当我调用函数"copay"并将其值(指针)分配给"duplicate"时,我得到了分段错误,但如果我只使用"copay"并且不将其分配给任何其他变量,那么就没有问题了。

typedef struct node {
    int data;
    struct node *next;
    struct node *prev;
} node;

void insert(node **head, int data) {
    node *new = (struct node *)malloc(sizeof(node));
    new->data = data;
    new->next = NULL;
    node *temp = *head;
    if (!(temp)) {
        *head = new;
        new->prev = NULL;
        // printf("n return  : %d",data);
        return;
    }
    while (temp->next)
        temp = temp->next;
    temp->next = new;
    new->prev = temp;
    // printf("n return  : %d",data);
}
void print(node **head) {
    node *temp = *head;
    printf("n");
    while (temp) {
        printf(" %d ->", temp->data);
        temp = temp->next;
    }
    printf(" NULLn");
}
node *copay(node **head) {
    node *temp = *head;
    return temp;
}
int main() {
    node *head;
    insert(&head, 1);
    insert(&head, 3);
    insert(&head, 5);
    insert(&head, 7);
    insert(&head, 9);
    (head)->prev = (head)->next->next;
    (head)->next->next->prev = (head)->next->next->next->next;
    (head)->next->next->next->next->prev = (head)->next;

    print(&head);
    node *duplicate = copay(&head);
    // print(&duplicate);
}

函数main()有一个非常简单的问题:

node *head;

head已定义但未初始化。您必须将其初始化为NULL以使insert()正常工作,否则您将有未定义的行为。顺便提一下,将insert命名为一个实际上是向列表追加节点的函数,这很容易引起混淆。将这一行改为:

node *head = NULL;

我不明白你想用这些行来达到什么目的:

(head)->prev = (head)->next->next;
(head)->next->next->prev = (head)->next->next->next->next;
(head)->next->next->next->next->prev = (head)->next;

其余的我看还行。

copay()在运行时实际上没有问题。copay()退出后,问题发生在它的调用者(这里是main函数)身上。Copay()返回一个指向节点的指针,但问题是只有在Copay()运行时才分配本地节点temp。当copay()退出时,它的所有本地内存都被释放。因此,调用者将留下一个指向已释放节点的指针。

我建议你去阅读斯坦福CS教育图书馆的指针和内存的第2部分,它是关于本地内存的。

来源:指针和内存

相关内容

  • 没有找到相关文章

最新更新