You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 10:10:35