我正在尝试编辑部分后网堆栈以不使用 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/