C:链接列表 - 功能"先插入"没有按预期工作

时间:2016-07-04 21:49:05

标签: c pointers linked-list malloc

在下面的代码中,您可以看到使用C中的指针实现的基本整数链接列表。 我已经写了两个不同的函数,用于在列表的前面插入一个新的int-val。 我认为这两个函数是等价的,但是输出显示它们不是。

#include <stdio.h>
#include <stdlib.h>

typedef struct _IntlistElem* Intlist;
typedef struct _IntlistElem {int val; Intlist next;} IntlistElem;

Intlist insertfirst(int val, Intlist list) {
    Intlist new = malloc(sizeof(IntlistElem));
    new->val = val;
    new->next = list;

    return new;
}

Intlist insertfirstAlternative(int val, Intlist list) {
    IntlistElem new = {val, list};
    Intlist head = &new;

    return head;
}

void print(Intlist l){
    while (l!=NULL){
        printf("%d\n", l->val);
        l = l->next;
    }
printf("_____\n");
}

int main(){
    Intlist ls = NULL;
    ls = insertfirst(2, ls);
    ls = insertfirst(1, ls);
    print(ls);

    Intlist lsAlt = NULL;
    lsAlt = insertfirstAlternative(2, lsAlt);
    lsAlt = insertfirstAlternative(1, lsAlt);
    print(lsAlt);

    return 0;
}

输出:

1
2
_____
1
1
...

我的问题是:
1。 为什么打印功能不会终止? (在调用替代功能后)
2。 为什么这些2&#34; insertfirst&#34; -functions与我预期的不相同? 这些功能有什么区别?

我期待着你的回答。 :)

1 个答案:

答案 0 :(得分:1)

您的函数insertfirstAlternative返回指向head的指针。该变量的生命周期从函数返回时结束。因此,它返回一个无效的指针值。

  

当指针指向的对象到达其生命周期的末尾时,指针的值变得不确定。

任何事情都可能发生。

在您的情况下,第二次调用该函数时,第二个head创建在与第一个相同的地址,因此next指针指向同一个对象。因此无限循环。