C++中vector类结合指针的内容访问问题咨询
问题分析与解决方案
你的问题出在运算符优先级上,这是C++里很容易踩的细节坑!
先看你代码里的错误行:
cout << "Print content: " << *t[0][0][0] << endl;
C++中[]的优先级比*高,所以这行代码会被编译器解析成:
*( ((t[0])[0])[0] )
而t[0]是一个vector<vector<float>>*类型的指针,t[0][0]相当于*(t[0] + 0),也就是取指针指向的vector<vector<float>>对象;接着[0]取这个二维vector的第一个元素(vector<float>);再[0]取这个一维vector的第一个元素(float类型的6.2)。最后你试图对一个float值解引用(*),这显然是非法的——只有指针类型才能被解引用,所以这行代码要么编译报错,要么运行时崩溃。
正确的写法
你需要先解引用指针t[0],得到它指向的二维vector对象,再访问其元素,用括号明确优先级即可:
cout << "Print content: " << (*t[0])[0][0] << endl; // 正确输出6.2
或者你也可以分步写,让逻辑更清晰:
vector<vector<float>>* ptr = t[0]; cout << "Print content: " << (*ptr)[0][0] << endl;
额外注意事项
另外提醒你一个潜在风险:你把栈上的局部对象p和g的指针存入了vectort。如果t的生命周期超过了p和g(比如p、g所在的函数执行完毕后,t还在使用),那么t里的指针就会变成悬垂指针,访问它会导致未定义行为。如果需要长期存储,建议考虑使用vector<vector<vector<float>>>(直接存对象)或者智能指针(比如vector<unique_ptr<vector<vector<float>>>>)来管理内存。
内容的提问来源于stack exchange,提问作者isac
相关产品推荐
相关产品推荐

