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

C语言动态二维数组函数传参疑问:不同传参为何结果不同?

C语言动态数组修改的作用域与参数传递问题

核心疑问解答

当内存已经分配完成时:

  • 修改数组元素的内容:修改会在主函数/调用函数中保留,因为函数参数传递的指针指向同一块已分配的内存区域。
  • 修改指针变量本身的指向(比如给指针分配新内存):直接传递指针无法让主函数看到变化,必须传递指针的地址(即二级指针/三级指针),因为函数默认是值传递,传递的指针只是原变量的副本。

实际场景分析与代码示例

1. 动态分配二维数组:必须用int***参数

当你要在函数内给主函数的int**变量分配内存时,直接传递int**相当于传递了一个副本——函数内给副本分配内存后,主函数的原int**变量依然是未初始化的垃圾值。只有传递int***(int**的地址),才能让函数直接修改主函数中指针变量的指向。

正确实现代码:

#include <stdio.h>
#include <stdlib.h>

// 动态分配二维数组:传入int***,修改主函数中int**的指向
void dynamic(int*** arr, int rows, int cols) {
    // 先分配行指针
    *arr = (int**)malloc(rows * sizeof(int*));
    if (*arr == NULL) {
        perror("malloc failed");
        exit(EXIT_FAILURE);
    }
    // 分配每行的列内存
    for (int i = 0; i < rows; i++) {
        (*arr)[i] = (int*)malloc(cols * sizeof(int));
        if ((*arr)[i] == NULL) {
            perror("malloc failed");
            exit(EXIT_FAILURE);
        }
        // 给数组赋值示例
        for (int j = 0; j < cols; j++) {
            (*arr)[i][j] = i * cols + j;
        }
    }
}

// 释放二维数组
void freeArray(int** arr, int rows) {
    for (int i = 0; i < rows; i++) {
        free(arr[i]);
    }
    free(arr);
}

2. 矩阵加法:直接用int**参数即可

矩阵加法是修改数组元素的值,不是修改指针的指向。此时传递int**,函数拿到的指针副本依然指向已分配的内存区域,修改元素后,主函数的原数组因为指向同一块内存,自然能看到修改结果。

正确实现代码:

// 矩阵加法:sum = a + b
void add(int** sum, int** a, int** b, int rows, int cols) {
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            sum[i][j] = a[i][j] + b[i][j];
        }
    }
}

3. 错误示例:用int***做矩阵加法导致垃圾值

如果错误地用int***传递sum数组,若没有正确解引用到元素,会访问错误的内存地址,得到垃圾值。比如以下错误实现:

// 错误的矩阵加法实现:误用int***
void wrongAdd(int*** sum, int** a, int** b, int rows, int cols) {
    // 错误:直接操作sum指针本身,而不是解引用到元素
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            // 这里的*sum是int**,但如果没有正确指向已分配的sum数组,就会访问垃圾地址
            (*sum)[i][j] = a[i][j] + b[i][j];
        }
    }
}

注:如果要强行用int***,必须确保*sum已经指向主函数中分配好的sum数组,但这完全没必要,反而增加复杂度,容易出错。


完整调用示例

int main() {
    int rows = 3, cols = 3;
    int** arr1 = NULL;
    int** arr2 = NULL;
    int** sum = NULL;

    // 分配两个二维数组
    dynamic(&arr1, rows, cols);
    dynamic(&arr2, rows, cols);

    // 分配sum数组内存
    sum = (int**)malloc(rows * sizeof(int*));
    for (int i = 0; i < rows; i++) {
        sum[i] = (int*)malloc(cols * sizeof(int));
    }

    // 正确的矩阵加法
    add(sum, arr1, arr2, rows, cols);

    // 打印结果
    printf("Matrix Sum:\n");
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", sum[i][j]);
        }
        printf("\n");
    }

    // 释放内存
    freeArray(arr1, rows);
    freeArray(arr2, rows);
    freeArray(sum, rows);

    return 0;
}

内容的提问来源于stack exchange,提问作者Pranav Vasishta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 03:53:02