C 使用指针打印方形矩阵

C 使用指针打印方形矩阵,c,pointers,matrix,C,Pointers,Matrix,我浏览了之前回答的关于指针和矩阵的问题,但在这些情况下,矩阵被视为指向指针的指针。然而,我正在尝试创建一个函数,该函数使用一个简单的指针读取矩阵,另一个函数打印矩阵。 这是我的代码,读取函数似乎工作正常,但程序在打印部分崩溃。如果我从printf语句中删除“*”,程序就会工作(也就是说,它打印从4到4的数字-我想这没问题,因为int存储在4个字节上) void readm(int*p,int n) { p=(int*)malloc(sizeof(int)*n*n); 对于readm函数中的(in

我浏览了之前回答的关于指针和矩阵的问题,但在这些情况下,矩阵被视为指向指针的指针。然而,我正在尝试创建一个函数,该函数使用一个简单的指针读取矩阵,另一个函数打印矩阵。 这是我的代码,读取函数似乎工作正常,但程序在打印部分崩溃。如果我从printf语句中删除“*”,程序就会工作(也就是说,它打印从4到4的数字-我想这没问题,因为int存储在4个字节上)

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

对于
readm
函数中的(int i=0;i),这一行有问题:

p=(int *)malloc(sizeof(int)*n*n);
在这里,您只分配给指针的本地副本。调用
readm
时使用的变量将不会更改

您需要“通过引用”传递指针:


问题是调用函数
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 );
}
对于函数
printm
,则无需将其重新声明为

无效打印M(整数**p,整数n)

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

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

指向一维数组的指针定义如下:

int *p1dArr;
int **p2dArr;
指向二维数组的指针定义如下:

int *p1dArr;
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");
    }
}
void readm(int**p,int行,int列)
{
p=malloc(行*尺寸(*p));
对于(int r=0;r
您最好将其标记为C。您认为程序崩溃是什么意思?
SEGFAULT
?您是否也可以包含使用这些函数的代码?谢谢,它现在工作正常。最初我认为,鉴于我使用的是指针,它在函数中遭受的修改将在外部(我将此与这样一个事实相关联:当您希望参数的修改在函数外部可见时,您可以使用“&”传递它,从而使用它的地址。)
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");
    }
}