C: getchar() 销毁指针

C: getchar() destroys pointer

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() 销毁。我不知道为什么或如何相关。

makelist 中,您需要分配一个新列表,但是您没有 return 将其复制到局部变量中,而是泄漏了刚刚分配的内存。相反,return 一个指针:

LinkedList *makeList()  // Note *
{
    LinkedList *temp = calloc(1, sizeof(LinkedList));
    temp->head = calloc(60, sizeof(char));
    temp->next = 0;
    temp->current = toAdd;
    return temp;    // Note temp is a pointer
}

addToList 中您不需要 nextNode 变量:

lstPointer->next = makelist();