请帮我解决这个意外的输出
Please help me get through this unexpected output
这是我的链表示例 C++ 代码。这实际上不是链表,而只是一个虚拟程序。我得到了这个程序的意外输出。
#include<iostream>
using namespace std;
struct list{
int data;
list *next;
};
void setData(list ob){
int d;
cout<<"enter data"<<endl;
cin>>d;
ob.data=d;
}
void getData(list ob){
cout<<"Data is :"<<ob.data<<endl;
}
int main(){
list node1,node2,node3;
setData(node1);
setData(node2);
setData(node2);
getData(node1);
getData(node2);
getData(node3);
return 0;
}
我的代码输入是 2,3 和 4。我得到的意外输出是 -
enter data
2
enter data
3
enter data
4
Data is :2293540
Data is :4201920
Data is :2293608
编辑
struct list{
char data; list next;
}
void main(){
list *start,node1,node2;
//I got stuck on the below two lines
start=(struct list)malloc(sizeof(list)); //Dynamic allocation of memory of size list whose address is stored in start
start=&node1; // start holds the address of node1 which is not dynamically allocated .
我不明白为什么如果第二个语句通过给它提供堆栈中 node1 的内存地址(至少我理解的)来覆盖它,为什么 *start 会被赋予一个动态地址。
因为您正在按值传递链表。要更改此设置,请通过引用传递。
void setData(list& ob){
int d;
cout<<"enter data"<<endl;
cin>>d;
ob.data=d;
当您按值传递时,C++ 会对您传入的任何内容进行 复制。因此,当您调用 getData
时,您传入的是列表的副本其中没有数据,因此正在打印垃圾。
您需要通过引用list
传递您的
void setData(list& ob){
int d;
cout<<"enter data"<<endl;
cin>>d;
ob.data=d;
}
您当前通过 值 传递 ob
,因此虽然您确实正确设置了 data
属性,但您这样做是为了 ob
的函数本地副本,而不是您传入函数的原始 list
。
这是我的链表示例 C++ 代码。这实际上不是链表,而只是一个虚拟程序。我得到了这个程序的意外输出。
#include<iostream>
using namespace std;
struct list{
int data;
list *next;
};
void setData(list ob){
int d;
cout<<"enter data"<<endl;
cin>>d;
ob.data=d;
}
void getData(list ob){
cout<<"Data is :"<<ob.data<<endl;
}
int main(){
list node1,node2,node3;
setData(node1);
setData(node2);
setData(node2);
getData(node1);
getData(node2);
getData(node3);
return 0;
}
我的代码输入是 2,3 和 4。我得到的意外输出是 -
enter data
2
enter data
3
enter data
4
Data is :2293540
Data is :4201920
Data is :2293608
编辑
struct list{
char data; list next;
}
void main(){
list *start,node1,node2;
//I got stuck on the below two lines
start=(struct list)malloc(sizeof(list)); //Dynamic allocation of memory of size list whose address is stored in start
start=&node1; // start holds the address of node1 which is not dynamically allocated .
我不明白为什么如果第二个语句通过给它提供堆栈中 node1 的内存地址(至少我理解的)来覆盖它,为什么 *start 会被赋予一个动态地址。
因为您正在按值传递链表。要更改此设置,请通过引用传递。
void setData(list& ob){
int d;
cout<<"enter data"<<endl;
cin>>d;
ob.data=d;
当您按值传递时,C++ 会对您传入的任何内容进行 复制。因此,当您调用 getData
时,您传入的是列表的副本其中没有数据,因此正在打印垃圾。
您需要通过引用list
传递您的
void setData(list& ob){
int d;
cout<<"enter data"<<endl;
cin>>d;
ob.data=d;
}
您当前通过 值 传递 ob
,因此虽然您确实正确设置了 data
属性,但您这样做是为了 ob
的函数本地副本,而不是您传入函数的原始 list
。