You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:35:26