无限循环和指针

时间:2015-02-05 00:15:37

标签: c pointers linked-list

我是C的新手。我熟悉Python,Java,C#。因此,我遇到指针问题。

我正在尝试使用结构在C中实现链接列表。截至目前,该程序创建了根成员,然后再添加一个成员以获得2个链接成员的列表。然后它调用print方法,该方法应遍历每个项目并打印它们。不幸的是,该程序陷入无限循环,似乎打印了member->数据地址而不是数据本身。

正如我之前所说,我熟悉一些OOP语言。这个问题令人沮丧,因为一个简单的链表是我应该能够在几分钟内完成的。有帮助吗?代码如下。

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

struct Member{
    int data;
    struct Member *next;
};

struct Member *createMember(int i){
    struct Member *new;
    new = malloc(sizeof(struct Member));
    new->data = i;
    return new;
}

void print(struct Member *root){
    struct Member *current = root;
    while(current->next != NULL){
        printf("%i, ", current->data);
        current = current->next;
    }
    printf("%i", current->data);
}

main(){
    struct Member *root; 
    root = createMember(15);
    root->next = createMember(12);
    print(root);
}

1 个答案:

答案 0 :(得分:6)

此功能:

struct Member *createMember(int i)
{
    struct Member *new;
    new = malloc(sizeof(struct Member));
    new->data = i;
    return new;
}

分配空间并分配数据,但从不初始化next成员。结果是该成员包含不确定的数据,因此调用未定义的行为甚至评估,更不用说取消引用,前者在这里完成:

void print(struct Member *root)
{
    struct Member *current = root;
    while(current->next != NULL){ // HERE
        printf("%i, ", current->data);
        current = current->next; // AND HERE
    }
    printf("%i", current->data);
}

要解决当前问题,请更改分配函数以初始化所有成员:

struct Member *createMember(int i)
{
    struct Member *new;
    new = malloc(sizeof(struct Member));
    new->data = i;
    new->next = NULL; // ADDED THIS
    return new;
}

<强>输出

15, 12

其他问题仍然存在(内存泄漏,print()传递NULL指针的行为,更多迂腐错误检查等),但这与您的问题最紧迫相关。

祝你好运。