为什么这段代码会抛出一个seg错误

时间:2012-07-22 18:00:38

标签: c segmentation-fault

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矩阵 但我得到了一个分段错误。

3 个答案:

答案 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*)字节被解释为指针并跟随,从而导致访问未分配的内存。