我有一个矩阵结构:
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了,有人知道我为什么会遇到这个段错误?
感谢。
答案 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])。但是,首先要分配内存。