c - 为C中的链表中的新元素分配内存

标签 c linked-list

我正在尝试创建一个链表,我已经让它工作了,但我还是有点困惑。我正在使用以下结构:

typedef struct _MList
{
    int dx;
    int dy;
    struct _MList *next;
} MList_t, *MList_p;

我已经测试过这个结构是有意义的,并且我有一个打印列表的函数:

void mListPrint(MList_t *mList)
{
    MList_p node = mList;
    while (node->next != NULL)
    {
        printf("[%i,%i] ",node->dx,node->dy);
        node = node->next;
    }
    printf("[%i,%i]\n",node->dx,node->dy);
}

以及创建第一个节点的函数:

MList_t mListNew(int dx, int dy)
{
    MList_t newNode;
    newNode.dx = dx;
    newNode.dy = dy;
    newNode.next = NULL;    
    return newNode;
}

有了这个工作正常,我想我会尝试创建一个函数,在列表的末尾添加一个节点。我的第一次尝试是这样的:

void mListAdd(int dx, int dy, MList_t *mList)
{
    MList_p node = mList;

    while (node->next != NULL)
    {
        node = node->next;  
    }

    MList_t newNode = mListNew(dx,dy);
    node->next = &newNode;
}

这看起来不错,直到我添加了不止一个元素。经过多次调试后发现,在 mListAdd 中创建的“newNode”的内存地址始终相同。因此列表最终链接回自身。这是为什么?

我改为使用指向新节点的指针来实现 mListAdd,如下所示:

void mListAdd(int dx, int dy, MList_t *mList)
{
    MList_p node = mList;

    while (node->next != NULL)
    {
        node = node->next;
    }
    MList_p newNode = malloc(sizeof(MList_t));
    *newNode = mListNew(dx,dy);
    mListPrint(newNode);
    node->next = newNode;
}

这非常有效,但我觉得其他方法也应该有效。还是我错过了一些明显的东西?我正在尝试通过实现我在 Java 和 ML 中学到的不同数据结构来学习 C 语言以进行面试。

我对代码量感到抱歉,但我认为最好尽可能彻底地解释我的问题。提前感谢您的帮助!

最佳答案

mListNew 中你使用了一个局部变量:

MList_t newNode;

一旦您从函数返回,这就会超出范围。所以你在未定义的领域。代码看起来好像只是因为内存管理器没有覆盖该局部变量占用的内存块而起作用。

您应该在 mListNew 中使用 malloc 分配新的列表节点,并返回指向新节点的指针,如下所示:

MList_p mListNew(int dx, int dy)
{
    MList_p newNode = malloc(sizeof(MList_t));
    newNode->dx = dx;
    newNode->dy = dy;
    newNode->next = NULL;    
    return newNode;
}

关于c - 为C中的链表中的新元素分配内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2251385/

相关文章:

c++ - 检测内存泄漏的工具

c - C语言数据排序

linked-list - 为什么在链表中间插入是O(1)?

java - 通用节点和对象节点有什么区别

c++ - 段错误 : 11 when trying to sort linked list by odds and evens

c - 返回语句在哪里保存它的数据?

c - 发生事件时向左移位一次

java - 为什么 LinkedList 打印为空白?

c - 使用 mysql_stmt_prepare 时如何引用 char* 而不是使用 char[]

c - 实现内核的链表接口(interface)时出错