再次打印指针值会返回错误的结果

时间:2015-02-14 23:06:37

标签: c++ pointers struct

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

#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;    

}

整个程序似乎没问题,但是当我第二次打印结果时,它会返回错误的值。

例如:

10
20
30
1447361072
40
1447361072

3 个答案:

答案 0 :(得分:2)

您可以使用在堆栈上创建的自动变量的内容,并使用InsertInFront()函数的本地内容。当InsertInfron()函数退出时,将删除此变量。然后,在从InsertInFront()函数返回后,头指针指向一些垃圾剩余。

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()返回后有效。

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

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

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

答案 1 :(得分:0)

您尚未初始化head元素,例如

IntElement *head = 0;

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

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

我想这是一些学习/家庭作业,否则我建议使用std::list

答案 2 :(得分:0)

您正在newElem函数中插入存在于堆栈中的insertElem。因此,当您第二次打印#34;时,它会在打印过程中被覆盖。第一次工作只是因为没有别的东西触及堆栈的那一点。

使用

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