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&lt;student&gt; 而不是std::vector&lt;student*&gt;*std::string 而不是char*。这将立即使您的代码更简单、更安全并且没有内存泄漏 很多额外的不应该出现的新表达式,这种风格会产生内存泄漏 @alterigel 对不起,这是一个学校项目,我必须使用指针。 @FaizanKarim vector&lt;student*&gt; 表示灾难,因为该向量不会释放分配给学生的内存,并且显然student 不会释放字符串。 void add(vector&lt;student*&gt;* paramlist) 不是 C++ 方式,除非您需要对指针进行操作,否则将是 void add(vector&lt;student*&gt;&amp; 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,您将获得vector 元素的地址,即student*。 你得到student,你需要其他*

您可以使用for (auto i: list) 让您的生活更轻松。

【讨论】:

问题是如果我把 2 * 然后我得到一个无效的二进制表达式 ostream 和 student 的操作数。 您的解决方案是对的。但是*i 没有给出容器元素的地址。它是对容器元素的引用。而且由于这里的容器保存了指针,*i 是对指针的引用。 @Faizan Karim,因为你没有写ostream &amp;operator&lt;&lt;(std::ostream &amp;os, const student &amp;val)

以上是关于c++程序打印出地址而不是值的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio C++ 执行 cmd.exe 而不是我的程序 [关闭]

C++获得程序的调用栈的几种方法

程序未从文本文件 c++ 中打印出字符串

如何打印出 C++ 映射值?

0xcdcdcdcd异常值引发C++程序崩溃问题的详细分析

利用C++编程,将hook(钩子)加到程序每一个函数,其中hook后跳转到自己自定义函数代码,实现函数打印功能