我无法理解为什么我的代码在访问数组时崩溃。将函数参数转换为 int[3][3]
而不是 int**
时,我没有遇到任何问题,但我不明白为什么,因为 int**
我给出的参数是一个有效的指针,它指向 main
typedef struct {const unsigned int m; const unsigned int n;} mat_size;
void print_mat(int** mat, mat_size s){ // <-- faulty version
int i,j;
for(i = 0; i < s.m; i++){
for(j = 0; j < s.n; j++){
printf("%d ", mat[i][j]);
}
printf("\n");
}
printf("=============");
}
int main(int argc, char** argv) {
int matrix[3][3] = {{1,4,2},{7,-1,15},{33,-10,-1}};
mat_size s = {3,3};
print_mat(matrix, s);
while(1);
return 0;
}
void print_mat(int mat[3][3], mat_size s){ // <-- good version
int i,j;
for(i = 0; i < s.m; i++){
for(j = 0; j < s.n; j++){
printf("%d ", mat[i][j]);
}
printf("\n");
}
printf("=============");
}
最佳答案
函数参数的类型与传递的矩阵不匹配,因为 matrix[3][3]
不是 int**
而是 (*int )[3]
。
根据评论,您还希望矩阵具有动态大小,因此您可以使用 VLA 来做到这一点:
#include <stdio.h>
typedef struct
{
const unsigned int m;
const unsigned int n;
} mat_size;
void print_mat(mat_size s, int (*mat)[s.n])
{
unsigned int i, j;
for (i = 0; i < s.m; i++)
{
for (j = 0; j < s.n; j++)
{
printf("%d ", mat[i][j]);
}
printf("\n");
}
printf("=============\n");
}
int main(int argc, char** argv)
{
int matrix[3][3] = { { 1, 4, 2 }, { 7, -1, 15 }, { 33, -10, -1 } };
mat_size s = { 3, 3 };
print_mat(s, matrix);
return 0;
}
关于访问预定义数组时代码崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42803110/