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

为何多维数组指针传递给函数后访问会触发段错误?

为什么传递指向多维数组的指针给函数后访问会出现段错误?

嘿,这个问题我太熟悉了——核心问题出在C语言的参数传递机制上,你在函数里对指针的修改根本没传到主函数里,导致主函数里的指针还是无效状态,访问自然就崩了。

咱们来拆解下你的代码问题:
你的gen_matrix函数参数是int **array,当你从主函数调用它时,C会把主函数里的指针变量复制一份传给这个参数。你在函数里执行array = (int **) malloc(...),其实只是修改了函数内部的那个副本指针,主函数里原来的指针完全没变化——它还是初始的NULL或者随机垃圾值,当你在主函数里尝试访问这个指针指向的内容时,必然触发段错误。

给你两种靠谱的解决方案:

方案1:让函数返回分配好的指针

这是最直观的写法,直接把分配好的二级指针返回给主函数:

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

int **gen_matrix(int rm, int cm) {
    int **array = (int **) malloc(sizeof(int *) * rm);
    for (int r = 0; r < rm; ++r) {
        array[r] = (int *) malloc(sizeof(int) * cm);
        for (int c = 0; c < cm; ++c) {
            array[r][c] = 1;
        }
    }
    return array;
}

int main() {
    int rows = 3, cols = 3;
    int **matrix = gen_matrix(rows, cols);
    
    // 测试访问矩阵
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    // 重要:用完记得释放内存,避免泄漏
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}

方案2:传递指针的指针(修改主函数的指针变量)

如果你坚持要用void类型的函数,那就要传递int ***array——也就是二级指针的指针,这样才能在函数里修改主函数里的二级指针变量:

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

void gen_matrix(int ***array, int rm, int cm) {
    // 这里修改的是主函数里指针的内容
    *array = (int **) malloc(sizeof(int *) * rm);
    for (int r = 0; r < rm; ++r) {
        // 注意括号,优先级很重要
        (*array)[r] = (int *) malloc(sizeof(int) * cm);
        for (int c = 0; c < cm; ++c) {
            (*array)[r][c] = 1;
        }
    }
}

int main() {
    int rows = 3, cols = 3;
    int **matrix = NULL;
    // 传递指针的地址
    gen_matrix(&matrix, rows, cols);
    
    // 测试访问
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            printf("%d ", matrix[i][j]);
        }
        printf("\n");
    }
    
    // 释放内存
    for (int i = 0; i < rows; i++) {
        free(matrix[i]);
    }
    free(matrix);
    return 0;
}

额外提醒

  • 不管用哪种方案,一定要记得释放内存,不然会造成内存泄漏
  • 如果你的场景允许,还可以分配连续内存的二维数组(比如用int (*array)[cm]),这样内存更紧凑,释放的时候只需要free一次就行,不过这种写法需要C99及以上标准支持。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:34:11