使用指针打印方形矩阵

我已经浏览过以前回答有关指针和矩阵的问题,但在这些情况下,矩阵被视为指针的指针。 但是,我试图创建一个函数,它使用一个简单的指针和另一个打印它的函数读取矩阵。 这是我的代码,读取function似乎工作正常,但程序在打印部分崩溃。 如果我从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"); } } 

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 

然后,您必须使用address-of运算符调用该函数:

 int *p; readm(&p, X); /* Note use of address-of operator */ 

指向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"); } } 

问题是调用函数readm的调用代码不知道函数变量p (定义为函数的参数)内部得到了一个新值。 p是函数的局部变量,它的生命在退出函数后结束。

您应该按以下方式定义函数

 void readm( int **p, int n ) { *p = (int *)malloc( sizeof(int ) * n * n); for ( int i=0; i 

并称之为

 int *p; readm( &p, n ); 

至于functionprintm那么就没有必要重新声明它

void printm(int ** p,int n)

因为它不会改变指针。 我唯一要改变的是添加限定符const

 void printm( const int *p, int n );