gpt4 book ai didi

c++ - 结构 C++ vector 中的垃圾值

转载 作者:行者123 更新时间:2023-11-27 23:53:08 24 4
gpt4 key购买 nike

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

测试.h

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

测试.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;
}

不指定 vector 大小的输出:

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

当使用 resize(2) 时:

student: 
Name :

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

最佳答案

您的代码存在多个问题。第一个是您正在将 std::cout 打印到 std::cout。你的打印表达式有这个(省略换行符以使其明显):

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

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


另一件事是您对 resize 的使用。如果你使用它,你会得到一个 vector ,里面有两个 Student 对象,这是默认构造的。由于您没有为您的 Student 类提供合理的默认构造函数,因此其非类成员的值基本上是随机垃圾(读取它们是未定义的行为)。

最后一个问题是您的类有 char * 成员,但没有遵循三规则。这在您的示例中有效,其中成员是从字符串文字初始化的(除非您有 const 问题),但如果您稍后在其中存储一些动态分配的内存,可能会严重中断。

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

关于c++ - 结构 C++ vector 中的垃圾值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44775777/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com