结构C ++向量中的垃圾值

时间:2017-06-27 08:41:40

标签: c++ vector struct

我正在尝试使用结构的向量来满足我的需要,并且正在编写一些示例测试代码来理解行为。以下是我写的测试代码:

test.h

struct Student {
  char *name;
  int id;
  char *section;
};
typedef struct Student student_t;

test.cc

#include <iostream>
#include <vector>
#include "test.h"

using namespace std;

int main() {
  vector<student_t> vst;
  //vst.resize(2);
  student_t st;
  st.name = "student1";
  st.id = 4503;
  st.section = "secA";
  vst.push_back(st);
  vst.push_back({"student2", 4504, "secA"});
  for(auto const& s:vst) {
    std::cout<< " student: " << std::endl;
    std::cout << "Name : " << s.name <<
        std::cout << " Id : " << s.id <<
        std::cout << " Section : " << s.section << std::endl;
  }

  return 0;
}

输出而不指定向量的大小:

student: 
 Name : student10x6040c8 Id : 45030x6040c8 Section : secA
student: 
 Name : student20x6040c8 Id : 45040x6040c8 Section : secA

使用resize(2)时:

student: 
 Name : 

我无法弄清楚这个问题!我的初始化有问题吗?

3 个答案:

答案 0 :(得分:2)

您的代码存在多个问题。主要原因是您正在打印std::coutstd::cout。您的打印表达式具有此功能(省略换行符以使其显而易见):

std::cout << << "Name : " << s.name << std::cout

这可能不是您的意图,而是导致数字0x6040c8出现在您的输出中的原因(它可能是std::cout的地址)。

另一件事是您使用resize。如果你使用它,你将得到一个带有两个Student对象的向量,它是默认构造的。由于您没有为Student类提供合理的默认构造函数,因此其非类成员的值基本上是随机的grarbage(读取它们是Undefined Behavior)。

最后一个问题是,您的班级有char *个成员,而不遵守三条规则。这适用于您的示例,其中成员是从字符串文字初始化的(除了您有const个问题),但如果您稍后在其中存储一些动态分配的内存,则可能会突破。

这两者的补救方法是同一个:将成员更改为std::string类型,它具有合理的默认初始化和复制功能。

答案 1 :(得分:1)

问题是代码:

   std::cout << "Name : " << s.name <<
        std::cout << " Id : " << s.id <<

如果删除换行符,我们会获得:

   std::cout << "Name : " << s.name << std::cout << " Id : " << s.id <<

呃,您为什么要在std::cout上打印std::cout?将结尾<<更改为;或:

   std::cout << "Name : " << s.name
             << " Id : " << s.id
   ...

除此之外:您通过namesection char *为自己存储所有的麻烦。它目前正在工作,因为您将它们设置为字符串文字(使用不推荐的转换)。一旦你尝试使它们变量,你将不得不处理它们的分配和解除分配。只要拯救自己所有的悲伤,让他们std::string并且快乐。

答案 2 :(得分:0)

代码似乎是正确的我发现奇怪的是使用char*时可以使用std::string

此外,问题似乎是输出,即

std::cout << "Name : " << s.name <<
std::cout << " Id : " << s.id <<
std::cout << " Section : " << s.section << std::endl;

你在std::cout内打印std::cout,这是疯了!

std::cout << "Name : " << s.name;
std::cout << " Id : " << s.id;
std::cout << " Section : " << s.section << std::endl;

你看,你错过了重要的时间;。欢迎来到C ++!

如果你是Linux人员,我建议你开始使用调试器gdb,我会帮助解决这些问题。