Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试填充结构中包含的矩阵时出现Seg错误_C_Matrix_Structure - Fatal编程技术网

C 尝试填充结构中包含的矩阵时出现Seg错误

C 尝试填充结构中包含的矩阵时出现Seg错误,c,matrix,structure,C,Matrix,Structure,我有一个矩阵的结构: struct Matrice{ int nblig; int nbcol; int **mat; }; 当我尝试填充矩阵时,我的程序出现seg故障: void initMat(Matrice *M) { int j, i; srand(time(0)); M->nbcol = (rand()%5)+1; M->nblig = (rand()%5)+1; for(i=0; i<M->

我有一个矩阵的结构:

struct Matrice{

    int nblig;
    int nbcol;
    int **mat;

};
当我尝试填充矩阵时,我的程序出现seg故障:

void initMat(Matrice *M)
{
    int j, i;
    srand(time(0));
    M->nbcol = (rand()%5)+1;
    M->nblig = (rand()%5)+1;
    for(i=0; i<M->nbcol;i++){
        for(j=0; j<M->nblig;j++){
           M->mat = rand()%101; //segfault here
        }
    }
}
void initMat(矩阵*M)
{
int j,i;
srand(时间(0));
M->nbcol=(rand()%5)+1;
M->nblig=(rand()%5)+1;
对于(i=0;inbcol;i++){
对于(j=0;jnblig;j++){
M->mat=rand()%101;//此处为segfault
}
}
}
我已经有一段时间没有练习C了,有人知道我为什么会有这个错误吗


谢谢。

您需要将
mat
成员初始化为具有适当行数和列数的二维数组

void initMat(Matrice *M)
{
    int j, i;
    srand(time(0));
    M->nbcol = (rand()%5)+1;
    M->nblig = (rand()%5)+1;

    M->mat = malloc(nbcol * sizeof(int));
    if (!M->mat)
    {
        /* memory allocation failed */
    }

    for(i=0; i<M->nbcol;i++){
        M->mat[i] = malloc(nblig * sizeof(int));
        if (!M->mat[i])
        {
            /* memory allocation failed */
        }

        for(j=0; j<M->nblig;j++){
           M->mat[i][j] = rand()%101;
        }
    }
}
void initMat(矩阵*M)
{
int j,i;
srand(时间(0));
M->nbcol=(rand()%5)+1;
M->nblig=(rand()%5)+1;
M->mat=malloc(nbcol*sizeof(int));
如果(!M->mat)
{
/*内存分配失败*/
}
对于(i=0;inbcol;i++){
M->mat[i]=malloc(nblig*sizeof(int));
如果(!M->mat[i])
{
/*内存分配失败*/
}
对于(j=0;jnblig;j++){
M->mat[i][j]=rand()%101;
}
}
}

您需要
#包括
,以便(无警告)访问
malloc
功能。

您需要将
mat
成员初始化为具有适当行数和列数的二维数组

void initMat(Matrice *M)
{
    int j, i;
    srand(time(0));
    M->nbcol = (rand()%5)+1;
    M->nblig = (rand()%5)+1;

    M->mat = malloc(nbcol * sizeof(int));
    if (!M->mat)
    {
        /* memory allocation failed */
    }

    for(i=0; i<M->nbcol;i++){
        M->mat[i] = malloc(nblig * sizeof(int));
        if (!M->mat[i])
        {
            /* memory allocation failed */
        }

        for(j=0; j<M->nblig;j++){
           M->mat[i][j] = rand()%101;
        }
    }
}
void initMat(矩阵*M)
{
int j,i;
srand(时间(0));
M->nbcol=(rand()%5)+1;
M->nblig=(rand()%5)+1;
M->mat=malloc(nbcol*sizeof(int));
如果(!M->mat)
{
/*内存分配失败*/
}
对于(i=0;inbcol;i++){
M->mat[i]=malloc(nblig*sizeof(int));
如果(!M->mat[i])
{
/*内存分配失败*/
}
对于(j=0;jnblig;j++){
M->mat[i][j]=rand()%101;
}
}
}

您需要
#包括
,以便(无警告)访问
malloc
功能。

我发现很难相信程序会在该行发生故障,但如果将随机值指定给指针,它很可能会在某个时间发生故障

您应该使用
malloc
为矩阵分配内存;事实上,如果使用双指针结构,则会多次使用。在C中处理矩阵时,我倾向于使用不同的结构:

struct Matrix {
    size_t ncols, nrows;
    int *mat;
};

然后使用
malloc(ncols*nrows)
初始化
mat
成员,并使用
mat[i*nrows+j]
索引。索引有点困难,但内存管理容易得多,一些矩阵运算可能会快得多,因为。

我发现很难相信程序会在那一行发生故障,但如果给指针分配一个随机值,它很可能会在某个时间发生故障

您应该使用
malloc
为矩阵分配内存;事实上,如果使用双指针结构,则会多次使用。在C中处理矩阵时,我倾向于使用不同的结构:

struct Matrix {
    size_t ncols, nrows;
    int *mat;
};

然后使用
malloc(ncols*nrows)
初始化
mat
成员,并使用
mat[i*nrows+j]
索引。索引有点困难,但内存管理容易得多,一些矩阵运算可能会快得多,因为。

看起来您正在尝试为mat分配一个数字。这有两个问题: -您需要为mat分配内存。现在你有一个指针,但默认情况下它不指向任何东西。
-直接分配给mat,将其视为单个整数。如果它应该是一个矩阵,您可能希望基于它进行索引(比如M->mat[i][j])。不过,请先分配内存。

看起来您正试图为mat分配一个数字。这有两个问题: -您需要为mat分配内存。现在你有一个指针,但默认情况下它不指向任何东西。
-直接分配给mat,将其视为单个整数。如果它应该是一个矩阵,您可能希望基于它进行索引(比如M->mat[i][j])。不过,要先分配内存。

你永远不会分配矩阵。(至少在你展示的代码中没有)。你从不分配你的矩阵。(至少在你展示的代码中没有)。啊。最近太多了。固定。我想我发现了C++程序员混淆<代码> <代码>和<代码> <代码>的习惯:信不信由你,我做的比C++多。我真的应该知道得更清楚些,但我已经很久没有这样做了。@Kustom666:我很高兴你解决了你的问题。请点击您认为对您帮助最大的答案投票下方的复选标记,接受此问题的其中一个答案。:-)啊。最近太多了。固定。我想我发现了C++程序员混淆<代码> <代码>和<代码> <代码>的习惯:信不信由你,我做的比C++多。我真的应该知道得更清楚些,但我已经很久没有这样做了。@Kustom666:我很高兴你解决了你的问题。请点击您认为对您帮助最大的答案投票下方的复选标记,接受此问题的其中一个答案。:-)