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

如何在C语言中用指针传递静态矩阵?程序报错求助

问题分析

你的程序抛出异常的核心原因是静态二维数组和int**类型不兼容:

  • 当你把int matrix[5][5]传递给函数时,它会退化为int (*)[5](指向包含5个int元素的数组的指针),而非int**(指向指针的指针)。
  • int**期望指向的是存储int指针的数组(比如动态分配的二维数组int** mat = malloc(size * sizeof(int*))这类结构),直接将静态二维数组传递给int**参数会导致内存访问的地址计算错误,触发异常。
正确实现方法

以下几种方式既满足用指针操作静态矩阵的需求,又能保证程序正常运行:

方法1:使用变长数组(VLA)参数(推荐,通用简洁)

C99及后续标准支持变长数组,允许函数参数用变量指定数组维度,适配任意大小的静态二维数组:

#include <stdio.h>

// 用变长数组作为参数,matrix是size列的二维数组指针
int Sumofsum(int size, int matrix[size][size]) {
    int sum = 0;
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

void SumofSumOut(int sum) {
    printf("Sum of sums of elements in those rows: %d\n", sum);
}

int main() {
    int matrix[5][5] = 
            {
                    {21,8, 3, 4, 5},
                    {1, 3, 5, 7, 9},
                    {2, 4, 6, 8, 9},
                    {1, 3, 4, 5, 7},
                    {3, 3, 3, 3,11}
            };
    int sum, size = 5;
    sum = Sumofsum(size, matrix);
    SumofSumOut(sum);
    return 0;
}

注:VS 2019及以上版本支持C99变长数组特性,旧版VS可选用方法2。

方法2:用一维指针配合偏移计算

将静态二维数组视为连续的一维内存块,手动计算偏移量访问元素,兼容所有C标准:

#include <stdio.h>

// 用int*接收数组,通过size计算元素偏移
int Sumofsum(int *matrix, int size) {
    int sum = 0;
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < size; ++j) {
            // 偏移量 = i*size + j,对应二维数组的matrix[i][j]
            sum += *(matrix + i * size + j);
        }
    }
    return sum;
}

void SumofSumOut(int sum) {
    printf("Sum of sums of elements in those rows: %d\n", sum);
}

int main() {
    int matrix[5][5] = 
            {
                    {21,8, 3, 4, 5},
                    {1, 3, 5, 7, 9},
                    {2, 4, 6, 8, 9},
                    {1, 3, 4, 5, 7},
                    {3, 3, 3, 3,11}
            };
    int sum, size = 5;
    // 静态二维数组内存连续,将首地址转为int*传递
    sum = Sumofsum((int*)matrix, size);
    SumofSumOut(sum);
    return 0;
}

方法3:指向固定列数的数组指针(固定列场景)

若能接受列数固定,可使用这种方式,不过你提到(*matrix)[5]不符合需求,这里仅作补充:

#include <stdio.h>

// 指向含5个int的数组的指针
int Sumofsum(int (*matrix)[5], int size) {
    int sum = 0;
    for (int i = 0; i < size; ++i) {
        for (int j = 0; j < 5; ++j) {
            sum += matrix[i][j];
        }
    }
    return sum;
}

// main函数无需修改,直接传递matrix即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 18:46:28