指针由C中的函数返回

时间:2015-05-23 20:11:18

标签: c pointers linked-list segmentation-fault return

以下是制作有2个指针的链表的代码。链接列表正在创建(打印),所有指针(prev + next)都可以。但是当我打电话给#34; copay"并将其值(指针)分配给"复制",我得到分段错误,但如果我只使用" 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(" NULL\n");
}

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);
}

2 个答案:

答案 0 :(得分:2)

函数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;

其余的看起来很好。

答案 1 :(得分:-2)

copay()在运行时实际上很好。在copay()退出后,问题发生在它的调用者(这里是主要功能)上。 copay()返回一个指向节点的指针,但问题是本地节点temp只在copay()运行时分配。当copay()退出时,其所有本地人都被解除分配。因此调用者留下了一个指向解除分配节点的指针。

我建议你参加斯坦福大学CS教育图书馆Pointers and Memory的第2部分,这是关于本地记忆的。

来源:Pointers and Memory