如何在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
相关产品推荐
相关产品推荐

