【发布时间】:2018-05-01 15:17:01
【问题描述】:
这段代码通过一系列函数调用来分配一个矩阵,但是当我打印它时,它返回了一个分段错误错误。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void mat_init(int** matx);
void pp_init(int** matx);
void p_init(int** matx);
void mat_fill(int** matx);
void mat_print(int** matx);
int main(void)
{
srand((unsigned)time(NULL));
int** matrix;
mat_init(matrix);
mat_print(matrix);
return 0;
}
void mat_init(int** matx)
{
pp_init(matx);
}
void pp_init(int** matx)
{
matx=malloc(4*sizeof(int*));
p_init(matx);
}
void p_init(int** matx)
{
for(int i=0;i<4;i++)
{
*(matx+i)=malloc(4*sizeof(int));
}
mat_fill(matx);
}
void mat_fill(int** matx)
{
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
*(*(matx+i)+j)=rand()%5;
}
}
//mat_print(matx);
}
void mat_print(int** matx)
{
printf("The matrix is:\n");
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
printf("%1i|",*(*(matx+i)+j));
}
puts("");
}
puts("");
}
请注意,仅当我使用 mat_print() int 打印矩阵时才会发生这种情况,如果我在函数 mat_fill() 中使用它,它可以正常工作,表明它已正确初始化。 有什么问题?
【问题讨论】:
-
为什么?矩阵的地址不是我已经传递给函数了吗?为什么我必须给指向第一个函数的指针的指针?
-
c 中的所有内容都是按值传递的。当您将
matx传递给函数时,会生成一个本地副本,就像您传递int一样。您对该本地副本所做的任何操作都仅限于其本地范围。如果您希望在本地范围之外看到本地操作,则必须返回该值(或者在此处的指针的情况下,您可以取消引用指针并修改它指向的内容)。但是matx在这里传递时并没有指向任何东西。如果你通过&matx,那么它会指向一些东西,但是在我的经验中处理3星指针并不是很常见。 -
所以它不起作用,因为当我将指针传递给函数时,指向指针的矩阵指针未初始化......如果我做了 matrix=malloc(4*sizeof(int*));基本上,去掉 pp_init 就可以了,对吧?
-
可能。测试一下。