使用指向动态分配二维数组的指针打印值时输出垃圾值问题排查
核心错误原因
你遇到的问题本质是两种二维数组的内存布局完全不兼容,强制类型转换后访问逻辑完全错位:
- 你定义的
int** array是「指针数组式」的二维数组,内存是分散的:array指向一段连续存储8个int*指针的内存,每个int*指针又各自指向独立分配的、512个int的内存块,整段内存不存在连续性。 - 你定义的
int (*ptr[2])[8][512]里的ptr[0]是指向「连续二维数组」的指针,它默认指向的内存是连续的8*512个int,访问时会直接按偏移量计算地址,不会做二次指针解引用。
你把array强制转成int(*)[8][512]类型后,访问(*ptr[0])[i][j]时,实际是把array里存储的各个行指针的值当成了int数据来读取,自然都是垃圾值。
两种修复方案
方案1:保持ptr类型不变,分配连续二维数组
如果要保留ptr的类型,就不要用分散的malloc分配行,直接分配整块连续内存:
int (*ptr[2])[8][512]; // 直接分配连续的8*512个int的二维数组 int (*array)[512] = (int(*)[512])malloc(8 * sizeof(*array)); ptr[0] = (int(*)[8][512])array; for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { array[i][j] = i+j; } } for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { cout<<"Val"<<((*ptr[0])[i][j])<<endl; } } // 最后释放内存只需要free一次 free(array);
方案2:保持array的分散分配方式,修改ptr类型
如果要保留int** array的分散分配逻辑,把ptr改成和array同类型的int**即可:
int** ptr; int** array; array = (int**)malloc(8 * sizeof(int*)); for (int i = 0; i < 8; i++) { array[i] = (int*)malloc(512 * sizeof(int)); } ptr = array; for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { array[i][j] = i+j; } } for (int i = 0; i < 8; i++) { for (int j = 0; j < 4; j++) { cout<<"Val"<<ptr[i][j]<<endl; } } // 释放内存要先释放每一行,再释放array for (int i = 0; i < 8; i++) free(array[i]); free(array);
内容的提问来源于stack exchange,提问作者Curiosity
相关产品推荐
相关产品推荐

