C++中vector内结构体数组的字符串被置空问题求助
问题分析与解决
你的问题出在结构体数组的初始化方式错误,导致字符串未被正确初始化,整数因属于POD类型(普通旧数据类型)侥幸能正常输出,但这种写法属于未定义行为,结果完全不可靠。
错误原因
你当前的数组初始化代码:
testStruct testArray[1] = { testArray[0] = {"String works", 69} };
这种写法存在严重逻辑问题:在数组初始化阶段,testArray[0]还处于构造过程中,你却在初始化列表里对它执行赋值操作。实际执行时,testArray[0]会先被默认构造(此时testString是空字符串),随后的赋值操作虽临时将字符串设为"String works",但由于初始化列表的逻辑错误,最终这个值并未被正确保留。
修正方案
将数组初始化改为标准的列表初始化,去掉内部的赋值操作即可:
testStruct testArray[1] = { {"String works", 69} };
如果使用C++11及以后的标准,还可以省略数组大小,让编译器自动推导:
testStruct testArray[] = { {"String works", 69} };
修正后的完整代码示例
#include <iostream> #include <string> #include <vector> #include "Header.h" //Test struct struct testStruct { std::string testString; // 建议显式使用std::前缀,避免依赖using namespace std; int testInt; }; // 正确的数组初始化 testStruct testArray[1] = { {"String works", 69} }; int main() { srand(time(NULL)); std::vector<testStruct> test; test.push_back(testArray[0]); // 可去掉多余大括号,直接传入testArray[0] std::cout << test[0].testString << "\n"; // 现在会正常输出"String works" std::cout << test[0].testInt << "\n"; // 依然输出69 characterCreation(); checkPlayerStats(); introduction(); return 0; }
额外提醒:尽量避免依赖using namespace std;,显式写出std::string、std::vector、std::cout等,既能避免潜在命名冲突,代码可读性也更强。
内容的提问来源于stack exchange,提问作者Bruno
相关产品推荐
相关产品推荐

