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

时间:2011-09-27 17:51:04

标签: c matrix structure

我有一个矩阵结构:

struct Matrice{

    int nblig;
    int nbcol;
    int **mat;

};

当我尝试填充矩阵时,我的程序出现了段错:

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
        }
    }
}

我已经有一段时间没练过C了,有人知道我为什么会遇到这个段错误?

感谢。

3 个答案:

答案 0 :(得分:3)

我发现很难相信程序会在这一行中出现段错误,但如果你为一个指针分配一个随机值,它很可能会在某个时候出现段错误。

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

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

然后使用mat初始化malloc(ncols * nrows)成员,并使用mat[i * nrows + j]进行索引。索引有点困难,但内存管理要容易得多,而且由于everything is stored in one array,某些矩阵运算可能会变得更快。

答案 1 :(得分:1)

您需要将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;
        }
    }
}

您需要#include <stdlib.h>才能(免提)访问malloc功能。

答案 2 :(得分:1)

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