如何用malloc为静态3D数组创建三级指针适配接收三级指针的函数
C语言静态3D数组适配三级指针的问题分析与解决
问题根源
静态分配的3D数组和int***三级指针的本质类型完全不同:
- 静态二维数组
int arr2d[M][N]的每行是int[N]类型,能隐式转换为int*,所以你可以用malloc创建int**类型的指针数组,每行指向二维数组的对应行,此时类型兼容。 - 但静态3D数组
int arr3d[M][N][P]的每行是int[N][P]类型,对应的指针类型是int (*)[N][P](数组指针),而非int**。如果用malloc创建int**类型的指针数组,再把arr3d[i](数组指针)赋值给int**类型的元素,就会触发类型不兼容的警告。
解决方法
方法1:修改函数参数为数组指针(推荐)
直接让effect_array接收数组指针类型的参数,适配静态3D数组的原生类型,无需额外内存分配:
#include <stdio.h> // 使用可变长度数组(VLA)适配任意维度的3D数组 void effect_array(int m, int n, int p, int (*arr)[n][p]) { // 修改指定位置的元素 arr[1][0][1] = 99; } int main() { static int arr3d[3][2][4] = {0}; // 直接传入静态3D数组名 effect_array(3, 2, 4, arr3d); printf("%d\n", arr3d[1][0][1]); // 输出99 return 0; }
如果维度固定,也可以直接写死参数类型:void effect_array(int (*arr)[2][4])。
方法2:创建适配的指针数组(需强制转换)
如果必须保留int***类型的函数参数,需要创建存储数组指针的数组,再强制转换为int***传入(注意:此方法依赖指针大小一致的架构,不推荐跨平台使用):
#include <stdio.h> #include <stdlib.h> void effect_array(int*** arr) { arr[1][0][1] = 88; } int main() { static int arr3d[3][2][4] = {0}; // 分配存储数组指针的内存,元素类型为int (*)[2][4] int (*ptr3d)[2][4] = malloc(3 * sizeof(int (*)[2][4])); for (int i = 0; i < 3; i++) { ptr3d[i] = arr3d[i]; } // 强制转换为int***传入函数 effect_array((int***)ptr3d); printf("%d\n", arr3d[1][0][1]); // 输出88 free(ptr3d); return 0; }
内容的提问来源于stack exchange,提问作者frank
相关产品推荐
相关产品推荐

