C: getchar() 销毁指针

问题描述

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 中,您需要分配一个新列表,但随后不是返回它,而是将其复制到局部变量中,从而泄漏了您刚刚分配的内存。相反,返回一个指针:

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();

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...