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