地址重合(指针,C编程)

Sha*_*ack 2 c pointers

我有两个二维数组,我不知道为什么或如何,每个数组中的两个元素的地址重合.这是源代码:

#include <stdio.h>

int main()
{
    int i,j,m,n,o,p,*ptr;
    printf("Enter dimension of 1st matrix: ");
    scanf("%d * %d",&m,&n);
    printf("Enter dimension of 2nd matrix: ");
    scanf("%d * %d",&o,&p);
    int *a[m][n];
    int *b[o][p];
    if (n!=o) return 0;

    printf("\nEnter 1st matrix:\n");
    for (i=0;i<m;i++)
        for (j=0;j<n;j++)
        {   printf("%d   ",(a+i*(n-1)+i+j)); scanf("%d",(a+i*(n-1)+i+j));   }

    printf("\nEnter 2nd matrix:\n");
    for (i=0;i<o;i++)
        for (j=0;j<p;j++)
        {   printf("%d   ",(b+i*(p-1)+i+j)); scanf("%d",(b+i*(p-1)+i+j));   }

    /*Printing the matrices*/
    puts("");puts("");
    for (i=0;i<m;i++)
        {for (j=0;j<n;j++)
            {   ptr = (a+i*(n-1)+i+j);
                printf(" %d ",*ptr);    }   puts("");}puts("");
    for (i=0;i<o;i++)
        {for (j=0;j<p;j++)
            {   ptr = (b+i*(p-1)+i+j);
                printf(" %d ",*ptr);    }   puts("");}
}
Run Code Online (Sandbox Code Playgroud)

这是一个打印屏幕;丝网印刷显示两个重合的地址

因此,我在一个简单的程序中得到错误来计算两个矩阵的乘积.问题是,这是通常的吗?编译器或操作系统不应该处理这个问题吗?

另外,我为什么要这样做ptr = (a+i*(n-1)+i+j); printf(" %d ",*ptr);
为什么不行printf(" %d ",*(a+i*(n-1)+i+j));

NPE*_*NPE 6

首先,ab为指针数组和指针永远不会初始化.

int *a[m][n];
int *b[o][p];
Run Code Online (Sandbox Code Playgroud)

我的猜测是它的意思是:

int a[m][n];
int b[o][p];
Run Code Online (Sandbox Code Playgroud)

(其余代码需要相应更改.)

其次,你将指针视为ints(例如%d).请记住,指针可以宽于int.例如,在我的平台上,指针是64位并且ints是32位.