二维指针复制出现地址重叠,值不对

利用二维指针创建动态二维数组;
输入只取下三角
在复制时出现问题

问题1:

a=(int **)malloc(n*n);
b=(int **)malloc(n*n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <= i; j++)
        {
            scanf("%d",(int *)a+i*n+j);
        }
    }
memcpy(b,a,n*n);
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j <  n; j++)
        {
            printf("%d  ",*((int *)a+i*n+j));
        }
        printf("\n");

当n=2时,即位2x2的数组,给a输入,先输出a的地址

1
2 2
5265520  5265524
5265528  5265532

a的值

1  0   //为方便查看,三角外的随机数不关注
2  2

将输出代码改成

printf("%d  ",(int *)b+i*n+j);
printf("%d  ",*((int *)b+i*n+j));

地址及值为

3168400  3168404
3168408  3168412

1  0
8847704  0

自己摸索将

memcpy(b,a,n*n*sizeof(int));

此时n=2正常,n=3程序停止工作。
问题2:地址重叠

1
2 2
3 3 3
**3102864**  3102868  3102872          //数组b的地址
3102876  3102880  3102884
3102888  3102892  3102896
3102832  3102836  3102840          //数组a的地址
3102844  3102848  3102852
3102856  3102860  **3102864**

可见a的最后一个与b的第一个相同,然后打印a,b

1
2  2
3  3  1
1
0  1127968361
1781972340  45186  4747328

原a的值受影响,b问题同问题1
改成memmove依然没用。
感觉是哪里漏了基础的毛病
求解答

for (int j = 0; j <= i; j++)
为何是j<=i呢?不应该是j<n么?
你输入的数据不够,导致再输出时 for (int j = 0; j <n; j++)会输出没有初始化的数组元素,自然就是乱码了

这设计看着好不正常!二维数组的指针用法不是这样的吧?看着好乱。还有你是不是忘了 整形的大小?


malloc(n*n*sizeof(int));