【问题标题】:C: getchar() destroys pointerC: getchar() 销毁指针
【发布时间】: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-&gt;next = &amp;nextNode; 这是未定义的行为,因为nextNode 是一个局部变量。当函数退出并在 UB 之后使用此类引用时,局部变量将变为无效。
  • 顺便说一句:使用0xCCCCCCCC 作为一个特殊的指针值是一个非常糟糕的主意。

标签: c linked-list getchar


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2013-05-24
    • 1970-01-01
    • 1970-01-01
    • 2021-02-28
    • 2012-11-30
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多