Matrix - C中的分段错误

时间:2014-08-01 04:27:21

标签: c

运行此代码时发生分段错误。我找不到任何异常,如果我改变了垫子,它会运行[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);
}

3 个答案:

答案 0 :(得分:6)

main内,mat1mat2将衰减为指向int[3]的指针,该指针与int **不同。因此,getdata()putdata()会将指针值视为与实际不同的类型,从而导致未定义的行为。

int mat1[3][3];
int (*decayed_mat1)[3] = mat1;
assert(decayed_mat1 == &mat1[0]);

数组在C函数中通过“reference”传递。这实际上意味着声明为数组类型的函数参数实际上采用了衰减类型。

void getdata(int mat[3][3]);
void (*funcptr)(int (*)[3]) = getdata;

将函数参数类型更改为int[3][3],使参数的类型与传入的内容相匹配。

答案 1 :(得分:0)

除了其他方法之外,如果您知道要传递给函数的矩阵的维数,那么定义中唯一的维度就是columns的数量。您没有指定rows的数量。您的代码可以简单地重写如下:

#include <stdio.h>
#include <stdlib.h>
void getdata(int mat[][3])
{
    int i,j;
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
            mat[i][j] = rand()%3;
    }
}
void putdata(int mat[][3])
{
    int i,j;
    for (i=0;i<3;i++)
    {
        for (j=0;j<3;j++)
            printf("%d",mat[i][j]);
        printf("\n");
    }
}
int main(void)
{
    int mat1[3][3];
    int mat2[3][3];
    getdata(mat1);
    getdata(mat2);
    putdata(mat1);
    return 0;
}

<强>输出:

$ ./msf
110
121
100

答案 2 :(得分:-1)

你必须在声明矩阵时使用** mat,因为在传递参数时,mat1 [] []已经分配了内存,但是函数本地的** mat没有与mem1类似的内存所以变量必须具有相似的内存,因此要么更改声明部分,要么在传递参数时。 感谢