我正在尝试使用结构的向量来满足我的需要,并且正在编写一些示例测试代码来理解行为。以下是我写的测试代码:
struct Student {
char *name;
int id;
char *section;
};
typedef struct Student student_t;
#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 :
我无法弄清楚这个问题!我的初始化有问题吗?
答案 0 :(得分:2)
您的代码存在多个问题。主要原因是您正在打印std::cout
到std::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
...
除此之外:您通过name
和section
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
,我会帮助解决这些问题。