二维与三维vector指针解引用的困惑及问题求助
多维std::vector指针解引用问题解析
二维vector的问题根源
你创建的std::vector<std::vector<float>>本质是存储vector对象的vector,而非连续的二维float数组。two_dim.data()返回的是指向std::vector<float>的指针(类型为std::vector<float>*),而非指向float的指针。
*two_dim_ptr等价于two_dim[0],即第一个长度为3的子vector。所以(*two_dim_ptr)[3]是对这个子vector的越界访问(它只有0-2三个索引),结果是未定义的(你看到的0只是巧合)。- 要访问
two_dim[1][0],正确的指针操作是:// two_dim_ptr+1指向第二个子vector,解引用后取索引0 std::cout << (*(two_dim_ptr + 1))[0] << std::endl; // 或者更简洁的写法 std::cout << two_dim_ptr[1][0] << std::endl; - 如果需要直接操作float指针,必须先获取子vector的
data():float* first_row_ptr = two_dim_ptr[0].data(); float* second_row_first_elem_ptr = two_dim_ptr[1].data(); std::cout << first_row_ptr[0] << std::endl; // 对应two_dim[0][0] std::cout << second_row_first_elem_ptr[0] << std::endl; // 对应two_dim[1][0]
三维vector的问题根源
对于std::vector<std::vector<std::vector<float>>> three_dim,three_dim.data()返回的是指向std::vector<std::vector<float>>的指针(类型为std::vector<std::vector<float>>*):
(*three_dim_ptr)[0]的类型是std::vector<float>,你试图把一个vector对象直接转成float,这显然是类型不兼容的,所以编译器报错。- 你写的
((float*) three_dim_ptr())是语法错误(three_dim_ptr是指针,不是函数),即使改成((float*) three_dim_ptr),也是非法的类型转换:外层vector的元素是std::vector<std::vector<float>>对象,不是连续的float内存,强制转换后访问的是vector对象的内部数据(比如容量、指针等),所以得到垃圾值。
正确的三维vector指针访问方式:
auto three_dim_ptr = three_dim.data(); // 访问three_dim[0][0][0] std::cout << three_dim_ptr[0][0][0] << std::endl; // 或者用多层解引用 std::cout << (*(*(*three_dim_ptr + 0) + 0))[0] << std::endl; // 获取最内层的float指针 float* elem_ptr = three_dim_ptr[0][0].data(); std::cout << elem_ptr[0] << std::endl;
关键区别:std::vector多维嵌套 vs C风格多维数组
C风格多维数组(如float arr[4][3])是连续的一块内存,所以可以直接转成float*访问;但嵌套的std::vector中,每个子vector都是独立的对象,它们的存储地址不一定连续,绝对不能把外层vector的data()当成连续的基础类型指针。
内容的提问来源于stack exchange,提问作者Polar Joker
相关产品推荐
相关产品推荐

