c++程序打印出地址而不是值
Posted
技术标签:
【中文标题】c++程序打印出地址而不是值【英文标题】:c++ program printing out address instead of value 【发布时间】:2020-10-11 22:18:12 【问题描述】:我有一个程序通过结构接收信息并将其放入向量中,我试图将这些信息打印出来,而是获取一个地址。该结构应该正确地保存值,所以我认为它要么是我的指针,要么是我打印出来的方式。
#include <iostream>
#include <cstring>
#include<vector>
using namespace std;
struct student
char* fName;
char* lName;
int id;
float gpa;
;
void add(vector<student*>*);
int main()
vector <student*>* list = new vector<student*>();
if (strcmp(cmd,"ADD") == 0)
add(list);
else if (strcmp(cmd,"PRINT") == 0)
for(vector<student*>::iterator i = list->begin(); i != list->end(); i++)
cout << *i;
cout << "print" << endl;
void add(vector<student*>* paramlist)
student* s = new student();
s->fName = new char[25];
s->lName = new char[25];
cout << "Enter first name" << endl;
cin >> s->fName;
cout << "Enter last name" << endl;
cin >> s->lName;
cout << "Enter id number" << endl;
cin >> s->id;
cout << "Enter GPA" << endl;
cin >> s->gpa;
paramlist->push_back(s);
或者它可能与我遍历向量的方式有关。
【问题讨论】:
您可能需要阅读此官方帮助页面,以了解为什么您的问题至少收到了一个反对票(不是来自我):How to create a minimal reproducible example 你为什么要使用指针?您应该简单地使用std::vector<student>
而不是std::vector<student*>*
和std::string
而不是char*
。这将立即使您的代码更简单、更安全并且没有内存泄漏
很多额外的不应该出现的新表达式,这种风格会产生内存泄漏
@alterigel 对不起,这是一个学校项目,我必须使用指针。
@FaizanKarim vector<student*>
表示灾难,因为该向量不会释放分配给学生的内存,并且显然student
不会释放字符串。 void add(vector<student*>* paramlist)
不是 C++ 方式,除非您需要对指针进行操作,否则将是 void add(vector<student*>& paramlist)
【参考方案1】:
您需要为结构添加运算符重载,以定义结构在打印时应如何显示。您还需要取消引用指针以及迭代器。
// Define how the struct should look when printed.
// This function makes it appear like:
// Name: John Smith, ID: 1235, GPA: 4.0
std::ostream &operator<<(std::ostream &os, const student &val)
os
<< "Name: " << val.fname << " " << val.lname
<< ", ID: " << val.id
<< ", GPA: " << val.gpa
<< endl;
return os;
然后……
for(vector<student*>::iterator i = list->begin(); i != list->end(); i++)
// Dereference twice, once for the iterator, and again for the pointer.
cout << **i << endl;
【讨论】:
【参考方案2】:您必须取消引用两次**i
。
使用*i
,您将获得vectorstudent*
。
你得到student
,你需要其他*
。
您可以使用for (auto i: list)
让您的生活更轻松。
【讨论】:
问题是如果我把 2*
然后我得到一个无效的二进制表达式 ostream 和 student 的操作数。
您的解决方案是对的。但是*i
没有给出容器元素的地址。它是对容器元素的引用。而且由于这里的容器保存了指针,*i
是对指针的引用。
@Faizan Karim,因为你没有写ostream &operator<<(std::ostream &os, const student &val)
。以上是关于c++程序打印出地址而不是值的主要内容,如果未能解决你的问题,请参考以下文章