C++通过指针打印动态分配二维数组出现垃圾值的原因
问题根因
- 内存布局不兼容
你定义的int** array是指针数组,4个行指针分别指向独立申请的4个int数组,行与行之间内存不连续,且array存储的是行指针的地址。而int (*ptr)[4][4]是指向连续存储的4×4二维数组的指针,要求16个int元素连续排布,你强制将*array(第一行首地址)转换为该类型属于非法类型转换,触发未定义行为,这是出现垃圾值的核心原因。 - 运算符优先级错误
[]的优先级高于*,你写的*ptr[i][j]实际执行逻辑是*(ptr[i][j]):先将ptr偏移i个4×4数组的长度,再偏移j个长度为4的int数组的长度,最后解引用,完全不符合你要访问第i行第j列的预期。
修复方案
方案一:适配原有指针数组的内存结构,修改ptr类型
将ptr改为指向长度为4的int数组的指针,匹配每行的内存结构:
#include <iostream> using namespace std; int main() { int (*ptr)[4]; int** array; array = new int*[4]; for (int i = 0; i < 4; i++) { array[i] = new int[4]; } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { array[i][j] = 1; } } for (int i = 0; i < 4; i++) { ptr = array[i]; for (int j = 0; j < 4; ++j) { cout << "Val " << ptr[j] << " And index " << i << " and " << j << endl; } } // 释放内存避免泄漏 for (int i = 0; i < 4; i++) { delete[] array[i]; } delete[] array; return 0; }
方案二:保留原ptr类型,申请连续的二维数组内存
如果要使用int (*ptr)[4][4]类型,需要直接申请连续的16个int内存空间,匹配指针要求的内存布局:
#include <iostream> using namespace std; int main() { int (*ptr)[4][4]; // 申请连续的4×4 int内存 ptr = new int[1][4][4]; for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; j++) { // 调整优先级,先解引用ptr再取下标 (*ptr)[i][j] = 1; } } for (int i = 0; i < 4; i++) { for (int j = 0; j < 4; ++j) { cout << "Val " << (*ptr)[i][j] << " And index " << i << " and " << j << endl; } } delete[] ptr; return 0; }
内容的提问来源于stack exchange,提问作者Curiosity
相关产品推荐
相关产品推荐

