第二次打印指针值 Returns 错误结果

Printing Pointer Value a Second Time Returns Wrong Result

有人可以解释我做错了什么吗? 我正在研究链表。所以,我写了一个函数在前面插入。

#include <iostream>
using namespace std;

typedef struct IntElement{
    struct IntElement *next;
    int data;

} IntElement;

bool insertInFront (IntElement **head, int data);


int main (void){

    IntElement *head;
    insertInFront ( &head, 10);
    cout << head->data<<endl;
    insertInFront ( &head, 20);
    cout << head->data<<endl;
    insertInFront ( &head, 30);
    cout << head->data<<endl;
    cout << head->data<<endl;
    insertInFront ( &head, 40);
    cout << head->data<<endl;
    cout << head->data<<endl;
    return 0;
}

bool insertInFront (IntElement **head, int data){

    IntElement newElem;
    newElem.data = data;
    newElem.next = *head;
    *head = &newElem;
    return true;    

}

整个程序看起来没问题,但是当我第二次打印结果时,它returns一个错误的值。

例如:

10
20
30
1447361072
40
1447361072

您使用了在堆栈上创建的自动变量的内容,并且是函数 InsertInFront() 的本地变量。当函数 InsertInfron() 退出时,该变量被删除。然后头指针指向函数 InsertInFront().

return 之后剩余的一些垃圾
bool insertInFront (IntElement **head, int data){

    IntElement newElem;   <-- create a IntElement (automatic variable)
    newElem.data = data;  <-- Fill a IntElement
    newElem.next = *head;
    *head = &newElem;      
    return true;    
                           <-- delete a IntElement 
}

下面从堆中分配,这样的动态变量在InsertInFront()return后有效。

bool insertInFront (IntElement **head, int data){

    IntElement *newElem = new IntElement;   
    newElem->data = data;  
    newElem->next = *head;
    *head = newElem;      
    return true;                  
}

不要忘记初始化空列表的头部!!!

您还没有初始化 head 元素,例如

IntElement *head = 0;

下一个问题是 insertInFront,您在列表中使用了局部变量。当你离开这个函数时,这个局部变量就消失了。你需要在堆上分配内存

IntElement *newElem = new IntElement();
newElem->data = data;
newElem->next = *head;
*head = newElem;

我想这是一些 study/homework 练习,否则我建议使用 std::list

您正在插入位于 insertElem 函数内部堆栈中的 newElem。所以当你打印的时候"second time",在打印的过程中已经被覆盖了。第一次成功只是因为没有其他东西触及堆栈的那部分。

使用

IntElement *newElem = new IntElement;
newElem->data = data;
newElem->next = *head;
*head = newElem;
return true;