【发布时间】:2021-04-19 11:57:09
【问题描述】:
typedef struct LinkedList LinkedList;
struct LinkedList {
LinkedList* next;
char* head;
char current;
};
LinkedList makeList()
{
char* headPointer = calloc(60, sizeof(char));
LinkedList temp = { 0xCCCCCCCC, headPointer, 0 };
return temp;
}
int addToList(LinkedList* lstPointer, char toAdd) {
if (lstPointer->head == NULL || lstPointer->head == 0xCCCCCCCC)
return -1;
if (lstPointer->current + 1 < 60) { /* enough space in the list to add */
*(lstPointer-> head + lstPointer -> current) = toAdd;
lstPointer->current = lstPointer->current + 1;
}
else /* not enough space, will create new node in the list */
{
if (lstPointer->next == 0xCCCCCCCC) {
LinkedList nextNode = makeList();
lstPointer->next = &nextNode;
}
return addToList(lstPointer->next, toAdd);
}
/*Added succsessfully*/
return 0;
}
int main(){
char chr;
LinkedList lst = makeList();
while ((chr = getchar()) != EOF) {
if (addToList(&lst, chr) == -1)
return -1;
}
return 0;
}
我正在尝试使用链表,但在填写第一个链表后,我创建了一个新链表并能够向其中添加一个项目。在第二项上,下一个列表指针被 getchar() 销毁。我不知道为什么或如何相关。
【问题讨论】:
-
lstPointer->next = &nextNode;这是未定义的行为,因为nextNode是一个局部变量。当函数退出并在 UB 之后使用此类引用时,局部变量将变为无效。 -
顺便说一句:使用
0xCCCCCCCC作为一个特殊的指针值是一个非常糟糕的主意。
标签: c linked-list getchar