我正在尝试编辑backnet堆栈的一部分,因为它始终失败,因此不使用malloc。该代码使用malloc创建对象并插入到链接列表中。在下面的代码片段中,我已经注释掉了malloc。我的计划是创建结构的本地实例并将其插入到我的列表中。我可以在我的列表中插入2个项目,当尝试添加第三个时,列表没有正确终止,我进入无限循环。谁能明白为什么我的清单没有正确终止?
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++;
}
此代码只是将元素添加到列表中,然后整个代码将一些变量设置为默认值。
答案 0 :(得分:1)
在我们在评论中进行了广泛的讨论之后,我认为很明显,你的问题是在全局列表中使用本地结构实例。在退出newNode()函数时,您在堆栈上创建的结构将变为无效,并且在下一次调用时将回收相同的堆栈空间。所以你将同一个实例链接到自己,并且在两次调用之后,你有一个循环列表,并进入一个无限循环。
由于您显然在没有堆的普通C上,您唯一的机会是在全局内存中滚动自己的struct allocator,在编译时预先分配。声明一个足够大的CHobjects全局数组,以满足所有分配(即列表的最大长度)。在你的情况下,这似乎是4.这是一个原始轮廓:
#define CHOBJECTS_MAX 4
static CHobjects gaCHobjects [CHOBJECTS_MAX];
static int giNextSlot = 0;
public: static CHobjects* Allocator ()
{
return gaCHObjects + giNextSlot++;
}
函数Allocator()从全局数组返回一个struct指针,并递增giNextSlot索引,因此每次调用都会获得一个新实例。在newNode()中使用此指针而不是本地CHobjects实例。
答案 1 :(得分:0)
您的问题有点不清楚,但我认为无论如何都可以给您一个有用的答案。
我认为你可以实现这一点的唯一方法是使用数组作为链表的存储空间,作为一个加号,你将同时拥有一个数组和一个链表
#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);
}
如您所见,您需要访问给定的数组元素以用作存储位置,并且该数组必须在链表的生命周期内有效。