运行此代码时发生分段错误.我找不到任何异常,如果我改变了垫子,它会运行[3] [3].请告诉我有什么问题,谢谢
#include<stdio.h>
void getdata(int **mat)
{
int i,j;
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
mat[i][j] = rand()%3;
}
}
void putdata(int **mat)
{
int i,j;
for (i=0;i<3;i++)
{
for (j=0;j<3;j++)
printf("%d",mat[i][j]);
printf("\n");
}
}
void main()
{
int mat1[3][3];
int mat2[3][3];
getdata(mat1);
getdata(mat2);
putdata(mat1);
}
Run Code Online (Sandbox Code Playgroud)
内main,mat1并且mat2将衰减到一个指针int[3],这是不一样的int **.因此,getdata()并且putdata()将指针值视为与实际不同的类型,从而导致未定义的行为.
int mat1[3][3];
int (*decayed_mat1)[3] = mat1;
assert(decayed_mat1 == &mat1[0]);
Run Code Online (Sandbox Code Playgroud)
数组在C函数中通过"reference"传递.这实际上意味着声明为数组类型的函数参数实际上采用了衰减类型.
void getdata(int mat[3][3]);
void (*funcptr)(int (*)[3]) = getdata;
Run Code Online (Sandbox Code Playgroud)
更改函数参数类型以int[3][3]使参数的类型与传入的内容相匹配.