使用malloc分配二维数组后传递给函数出现异常问题
问题:malloc分配的二维数组传递给函数后输出随机值
时隔许久重新使用C语言,无法记起如何将malloc分配后的二维数组传递给函数并正常使用。自认为指针传递正确,但函数中无法正常访问数组内容,输出随机值。代码如下:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> void matrixOperation(int *arr, int m, int n) { printf("in matrixOperation\n "); int i, j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) printf("%d\n", *((arr+i*n) + j)); } int main() { int i,j,count; int row, col; printf("Number of rows?\n "); scanf("%d", &row); printf("Number of columns?\n "); scanf("%d", &col); int* arr[row]; for (i = 0; i < row; i++) arr[i] = (int*)malloc(col * sizeof(int)); count = 0; for (i = 0; i < row; i++) for (j = 0; j < col; j++) arr[i][j] = ++count; for (i = 0; i < row; i++) for (j = 0; j < col; j++) printf("%d\n",arr[i][j]); matrixOperation((int *)arr, row, col); for (int i = 0; i < row; i++) free(arr[i]); return 0; }
代码功能为接收用户输入的矩阵行列数,填充递增数值后,main函数中可正常打印矩阵,但调用matrixOperation函数时输出随机值,希望该函数能和main中的打印结果一致。
问题分析
你创建的int* arr[row]是指针数组:它本质是一个数组,每个元素都是指向int的指针,每个指针指向一块独立的malloc分配内存块。这些内存块在堆上是不连续的。但你调用函数时将其强转为int*,函数内部用arr+i*n+j的方式访问,是把它当成了连续的一维内存块(即真正的二维数组在内存中的连续布局),这会导致访问错误的内存地址,输出随机值。
解决方案
方法1:修改函数参数为指针的指针
既然是指针数组,函数参数应接收int**类型,直接用二维数组语法访问:
void matrixOperation(int **arr, int m, int n) { printf("in matrixOperation\n "); int i, j; for (i = 0; i < m; i++) for (j = 0; j < n; j++) printf("%d\n", arr[i][j]); }
调用时无需强制转换,直接传递arr:
matrixOperation(arr, row, col);
方法2:分配连续的二维内存
如果想保留原函数的int*参数,可以分配一块连续的内存,将二维数组按一维数组的方式处理:
修改main中的内存分配逻辑:
// 分配连续的row*col个int的内存 int *arr = (int*)malloc(row * col * sizeof(int)); // 填充数据时使用一维索引计算 count = 0; for (i = 0; i < row; i++) for (j = 0; j < col; j++) arr[i*col + j] = ++count;
调用函数时直接传递arr:
matrixOperation(arr, row, col);
释放内存只需一次:
free(arr);
补充说明
你注释中提到的print(&arr[0][0], m, n)仅在二维数组内存连续时有效,而你的指针数组内存不连续,因此该写法同样会出错。
内容的提问来源于stack exchange,提问作者Alberto Cattaneo
相关产品推荐
相关产品推荐

