如何将已定义的二维矩阵作为参数传入双指针类型的C语言函数
二维数组传入双指针形参函数的解决方法
你定义的double A[3][3]是数组的数组,和函数形参的double**类型内存布局完全不同,无法直接传入,需要额外构造行指针数组再传参。
可行实现方案
方案1:构造行指针数组适配现有函数签名
如果无法修改trans的函数定义,用这种方法适配:
// 原始矩阵定义 double A[3][3] = {1,1,1, 1,1,1, 1,1,1}; // 构造和矩阵行数等长的指针数组 double *row_pointers[3]; for (int i = 0; i < 3; i++) { row_pointers[i] = A[i]; // 每个指针指向对应行的首地址 } // 传入指针数组,数组名自动退化为double**类型 double** result = trans(row_pointers);
如果需要处理可变长度的矩阵,可以动态申请行指针数组的内存,用完后记得释放即可。
方案2:修改函数签名(推荐,无额外开销)
如果有权限调整trans的实现,优先修改参数适配二维数组的连续内存布局:
// 固定第二维长度的写法 double** trans(double (*A)[3], int rows); // C99及以上支持的通用可变长度写法 double** trans(int rows, int cols, double A[static rows][cols]);
修改后可以直接传入原始二维数组,不需要额外构造指针数组,也没有额外的内存开销:
double** result = trans(A, 3);
避坑提示
不要尝试直接强转传参:
trans((double**)A)是严重错误的写法。double A[3][3]的内存是连续存储的9个double值,直接强转后会把前8字节的double值当做指针地址寻址,必然触发段错误,完全无法正常运行。
内容的提问来源于stack exchange,提问作者Michael
相关产品推荐
相关产品推荐

