C++声明结构体vector后后续std::cout无法输出是什么原因
问题原因
你代码的核心错误是空vector越界访问触发了C++未定义行为:
你声明的vector<process> dataframe是默认初始化的空容器,内部没有存储任何元素,直接通过dataframe[0]访问下标为0的元素属于非法越界操作,会破坏程序的内存布局,导致程序在执行到cout语句之前就已经崩溃退出,自然不会有任何打印输出。
你提到的「在vector声明之前添加cout就能正常运行」只是未定义行为在特定运行环境下的巧合表现,不代表问题被解决,代码依然存在崩溃风险。
另外你现有代码三次赋值都使用下标0,就算解决越界问题,所有值也会被覆盖写入第一个元素,无法存储3个不同的process对象。
修复方案
你可以选择以下任意一种方案修复问题:
- 方案1:声明vector时直接指定初始容量
把vector声明改为vector<process> dataframe(3);,后续可以合法访问下标0、1、2,注意把三次赋值的下标分别改为对应值:dataframe[0].id = 1; dataframe[0].at = 0; dataframe[0].bt = 3; dataframe[1].id = 2; dataframe[1].at = 2; dataframe[1].bt = 4; dataframe[2].id = 3; dataframe[2].at = 5; dataframe[2].bt = 6; - 方案2:使用
push_back动态添加元素,不需要提前指定容量:vector<process> dataframe; dataframe.push_back({1, 0, 3}); dataframe.push_back({2, 2, 4}); dataframe.push_back({3, 5, 6}); - 方案3:先调用
resize扩容后再用下标访问:vector<process> dataframe; dataframe.resize(3); // 后续就可以正常访问下标0~2的元素
内容的提问来源于stack exchange,提问作者rizin chuk
相关产品推荐
相关产品推荐

