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:我很高兴你解决了你的问题。请点击您认为对您帮助最大的答案投票下方的复选标记,接受此问题的其中一个答案。:-)