使用指针打印方形矩阵

时间:2014-01-12 14:27:15

标签: c pointers matrix

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

3 个答案:

答案 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");
    }
}