我已经浏览过以前回答有关指针和矩阵的问题,但在这些情况下,矩阵被视为指针的指针。但是,我试图创建一个函数,它使用一个简单的指针和另一个打印它的函数读取矩阵。 这是我的代码,读取功能似乎正常工作,但程序在打印部分崩溃。如果我从printf语句中删除“*”,程序就可以工作(即它打印4到4的数字,我想这没关系,因为int存储在4个字节上)。
void readm(int *p,int n)
{
p=(int *)malloc(sizeof(int)*n*n);
for(int i=0;i<n*n;i++)
scanf("%d",p+i);
}
void printm(int *p,int n)
{
for(int i=0;i<n;i++)
{
for(int j=0;j<n;j++)
printf("%d ",*(p+(i*n)+j));
printf("\n");
}
}
答案 0 :(得分:1)
在readm
函数中,您遇到此行的问题:
p=(int *)malloc(sizeof(int)*n*n);
此处仅指定指针的本地副本。调用readm
时使用的变量不将被更改。
您需要通过“引用”传递指针:
void readm(int **p,int n) /* Note pointer-to-pointer for `p` */
{
*p=malloc(sizeof(int)*n*n); /* Note pointer-dereference of `p` */
for(int i=0;i<n*n;i++)
scanf("%d",*p+i); /* Note pointer-dereference of `p` */
}
然后,您必须使用address-of运算符调用该函数:
int *p;
readm(&p, X); /* Note use of address-of operator */
答案 1 :(得分:1)
问题是调用函数readm
的调用代码不知道函数变量p
(定义为函数的参数)内部得到了一个新值。 p
是函数的局部变量,它的生命在退出函数后结束。
您应该按照以下方式定义功能
void readm( int **p, int n )
{
*p = (int *)malloc( sizeof(int ) * n * n);
for ( int i=0; i<n*n; i++ ) scanf( "%d", *p+i );
}
并将其命名为
int *p;
readm( &p, n );
对于函数printm
,则无需将其重新声明为
void printm(int ** p,int n)
因为它不会改变指针。我唯一要改变的是添加限定符const
void printm( const int *p, int n );
答案 2 :(得分:1)
指向1D数组的指针定义如下:
int *p1dArr;
指向2D数组的指针定义如下:
int **p2dArr;
你正在使用一维数组,就好像它是一个二维数组。这可能是你麻烦的根源。将您的功能定义更改为以下内容:
void readm(int **p, int row, int col)
{
p = malloc(row * sizeof(*p));
for(int r = 0; r < row; r++)
p[r] = malloc(col * sizeof(**p))
for(int r = 0; r < row; r++)
for(int c = 0; c < col; c++)
scanf("%d", &p[r][c]);
}
void printm(int **p, int row, int col)
{
for(int r = 0; r < row; r++)
{
for(int c = 0; c < col; c++)
printf("%d ", p[r][c]);
printf("\n");
}
}