如何将std::vector<std::vector<int>>转换为int**?现有转换结果错误
如何将std::vector<std::vector>转换为int**
你原来的代码之所以出错,核心问题在于类型不匹配:std::vector<std::vector<int>>::data()返回的是指向std::vector<int>对象的指针(即std::vector<int>*),而非int**。用reinterpret_cast强制转换后,程序会错误地把std::vector<int>的内部结构当成int*来解析,这属于未定义行为,输出结果自然不符合预期。
正确实现方法
要合法得到int**,需要手动构建一个指针数组,将每个子vector的底层指针存入其中:
#include <iostream> #include <vector> int main(int argc, char *argv[]) { std::vector<std::vector<int>> temp {{1,2,3},{4,5,6}}; // 构建存储子vector底层指针的数组 std::vector<int*> ptr_array; ptr_array.reserve(temp.size()); for (auto& sub_vec : temp) { ptr_array.push_back(sub_vec.data()); } // ptr_array.data() 就是合法的 int** int** t = ptr_array.data(); // 验证输出 for (int i = 0; i < 2; ++i) { for (int j = 0; j < 3; ++j) { std::cout << t[i][j] << " "; } } // 输出:1 2 3 4 5 6 }
关键注意事项
- 这个
int**的有效性依赖于两个vector:外层的temp不能被销毁、扩容或移动(否则子vector的底层内存可能失效),同时存储指针的ptr_array也不能提前销毁。 - 如果要将这个
int**传递给C风格API,必须确保在API执行期间,temp和ptr_array都处于有效状态。 - 永远不要直接强制转换外层vector的
data()结果,这种操作会彻底破坏类型安全,引发不可预测的问题。
内容的提问来源于stack exchange,提问作者jack
相关产品推荐
相关产品推荐

