C 链表无限循环

标签 c linked-list embedded

我正在尝试编辑部分后网堆栈以不使用 malloc,因为它总是失败。该代码使用 malloc 创建一个对象并插入到链表中。在下面的代码片段中,我注释掉了 malloc。我的计划是创建该结构的本地实例并将其插入到我的列表中。我能够将 2 个项目插入到我的列表中,当尝试添加第三个项目时,列表未正确终止,我进入了无限 while 循环。谁能明白为什么我的列表没有正确终止?

CHobjects 是一个结构,我想要它们的链接列表。我无法使用 malloc 创建新的 CHobject 实例。为了解决这个问题,我尝试创建 CHobject 的本地实例并将其添加到我的列表中。

CHobjects* newNode(instance, channel, name, description)
{
CHobjects *node;
CHobjects newNode;

    node=CHobjects;
    while(node!=NULL)
    {
        if(node->instance==instance) 
            return 
        node=node->next; 
    }
    if(strlen((char *)objectName)>objectNameMax || strlen((char *)description)>descriptionMax)
        goto cc8; //fail name or description is too long
// if((node=(CHobject *)malloc(sizeof(CHobject)))==NULL) //get a block of space for this object's info
// goto cc8; //fail if we can't get space for it
    test.next=CHobjects; //link on to list
    CHobjects=&test;
    CHcount++;
}

这段代码只是将元素添加到列表中,整个代码随后会将一些变量设置为默认值。

最佳答案

经过我们在评论中的广泛讨论,我认为很明显您的问题是在全局列表中使用本地结构实例。您在堆栈上创建的结构在退出 newNode() 函数时变得无效,并且在下次调用时回收相同的堆栈空间。因此,您将同一个实例链接到其自身,经过两次调用后,您将得到一个循环列表,并进入无限循环。

由于您显然使用的是没有堆的普通 C,因此您唯一的机会就是在全局内存中滚动您自己的结构分配器,并在编译时预先分配。声明一个足够大的 CHobjects 全局数组以满足所有分配(即列表的最大长度)。在你的例子中,这似乎是 4。这是一个原始轮廓:

#define CHOBJECTS_MAX 4

static CHobjects gaCHobjects [CHOBJECTS_MAX];
static int giNextSlot = 0;

public: static CHobjects* Allocator ()
    {
    return gaCHObjects + giNextSlot++;
    }

函数 Allocator() 从全局数组返回一个结构体指针,并递增 giNextSlot 索引,因此每次调用时都会获得一个新实例。在 newNode() 中使用此指针而不是本地 CHobjects 实例。

关于C 链表无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45516050/

相关文章:

c - 为 ARM 构建 Newlib 共享库

c - C中的反向链表程序

java - Recurcison Java 奇怪的行为,打印节点

java - 字符串的链接列表

Linux 线程性能在 GDB 下非常快,但在其他情况下非常慢

linux - 写入/dev/mem 时真的总是需要msync 吗?

C/C++ : printf use commas instead of dots as decimal separator

c - 读取文本文件和 C 中每个单词的大写首字母

创建包含 ncurses 的静态库

c - 寻找有效的交换字符指针