第二次打印指针值 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;
有人可以解释我做错了什么吗? 我正在研究链表。所以,我写了一个函数在前面插入。
#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;