void f(int **m, int w, int h )
{
int i,j;
for(i=0;i < w ; i++)
{
for(j=0;j<h;j++)
{
printf("%5d", m[i][j]); // *( *(m + i) + j ) ??
}
printf("\n");
}
return;
}
int main()
{
int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}};
f(a,3,3);
}
此代码正在尝试打印2d矩阵 但我得到了一个分段错误。
答案 0 :(得分:1)
您的矩阵不是int **
类型,其类型为int[3][]
。
int **
表示指向指针数组的指针。你没有一个指针数组,你有一个3整数数组的数组。这不是一回事。
如果您愿意,可以更改代码以将其考虑在内。
int *addr = (int *)m; // This is the address of m[0][0]
要访问m [i] [j],请使用:
int elem = addr[i*h+j];
答案 1 :(得分:1)
指向int
指针的指针与3x3
数组不同。
您应该以不同的方式声明您的功能,或者以不同的方式准备您的数组:
将f
更改为:
void f(int m[][3], int w, int h )
或者像这样准备数组:
int r0[] = {1,2,3};
int r1[] = {4,5,6};
int r2[] = {7,8,9};
int *a[] = {r0,r1,r2};
f(a,3,3);
答案 2 :(得分:1)
int a[3][3]={{1,2,3},{4,5, 6},{7,8,9}};
将其传递给f
并不起作用,a
的类型与f
预期的类型不兼容。传递给函数时,a
将转换为类型int (*)[3]
的指针,指向三个int
数组的指针。
f
期望指向int
的指针。您的编译器应该告诉您有关不兼容类型的信息。
未定义的行为会发生什么,可能是在m
中取消引用f
时,数组内容的第一个sizeof(int*)
字节被解释为指针并跟随,从而导致访问未分配的内存。