C 链表无限循环

C 链表无限循环,c,linked-list,embedded,C,Linked List,Embedded,我试图编辑backnet堆栈的一部分,以避免使用malloc,因为它总是失败。代码使用malloc创建对象并插入到链表中。在下面的代码片段中,我注释掉了malloc。我的计划是创建结构的本地实例并将其插入我的列表中。我可以在列表中插入2项,当尝试添加第三项时,列表没有正确终止,我进入了一个无限while循环。有人知道为什么我的名单没有正确终止吗 CHobjects是一个stuct,我想要一个链接列表。我无法使用malloc创建新的CHobject实例。为了解决这个问题,我正在尝试创建CHobje

我试图编辑backnet堆栈的一部分,以避免使用malloc,因为它总是失败。代码使用malloc创建对象并插入到链表中。在下面的代码片段中,我注释掉了malloc。我的计划是创建结构的本地实例并将其插入我的列表中。我可以在列表中插入2项,当尝试添加第三项时,列表没有正确终止,我进入了一个无限while循环。有人知道为什么我的名单没有正确终止吗

CHobjects是一个stuct,我想要一个链接列表。我无法使用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++;
}

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

您的问题有点不清楚,但我认为还是可以给您一个有用的答案

我认为实现这一点的唯一方法是使用数组作为链表的存储,另外,还可以同时使用数组和链表

#include <stdio.h>

struct list {
    int value;
    struct list *next;
};

static void
print_list(const struct list *item)
{
    while (item->next != NULL) {
        fprintf(stdout, "%d\n", item->value);
        item = item->next;
    }
}

int
main(void)
{
    struct list items[15];
    size_t count;

    count = sizeof items / sizeof *items - 1;
    for (int index = 0; index < count; ++index) {
        items[index].next = &items[index + 1];
        items[index].value = index + 1;
    }
    items[count].next = NULL;

    print_list(items);
}
#包括
结构列表{
int值;
结构列表*下一步;
};
静态空隙
打印列表(常量结构列表*项)
{
while(项目->下一步!=NULL){
fprintf(标准输出,“%d\n”,项->值);
项目=项目->下一步;
}
}
int
主(空)
{
结构列表项[15];
大小/数量;
count=sizeof items/sizeof*items-1;
对于(int index=0;index

如您所见,您需要访问给定的数组元素才能用作存储位置,并且该数组必须在链表的整个生命周期内都有效。

在我们的评论中进行了广泛的讨论之后,我认为很明显,您的问题在于在全局列表中使用本地结构实例。在堆栈上创建的结构在退出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实例。

请显示实际代码。哪里定义了
objectName
CHobject
在哪里定义?请发布真实代码。另外,使用良好的格式
strlen((char*)objectName)>objectNameMax
strlen((char*))objectName->objectNameMax
看起来一模一样,令人困惑。所以你会得到伪答案
node=CHobjects
是什么意思?
CHobjects
是一种类型。你是说有一个无限循环。你是说它在所显示的
语句中吗?这是你所显示的唯一循环。这意味着你的链接ed列表没有为最后一个元素的
next
属性正确地构造空值。您的代码没有多大意义。CHobjects似乎是一种结构类型,但后来您在赋值中使用了此符号,就像指向此结构的指针一样。显然,您以不正确的方式编辑代码以隐藏专有的异常。但是,这种混淆这几乎不可能帮助您。我已经尝试让我的问题更清楚。上面发布的代码是完整的,因为任何其他代码都只是设置默认值。我无法更改代码结构,但我需要替换malloc的使用。