为什么用动态申请内存的方法第一行最后一个数和第二行第一个数总是相等而且是错的?

输入m×n阶矩阵A和B,用函数编程计算并输出A与B之和。
输入格式要求:"%d,%d" 提示信息:"Input m, n:" "Input %d%d matrix a:\n" "Input %d%d matrix b:\n"
*输出格式要求:"Results:\n" "%6d"
程序运行示例如下:
Input m, n:2,3↙
Input 2
3 matrix a:↙
1 2 3 ↙
4 5 6 ↙
Input 2*3 matrix b:↙
11 12 13 ↙
14 15 16↙
Results:↙
12 14 16↙
18 20 22↙

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int m, n, *a, *b, i, j;
    printf("Input m, n:");
    scanf("%d,%d", &m, &n);
    a = (int *)malloc(m * n * sizeof(int));
    b = (int *)malloc(m * n * sizeof(int));
    printf("Input %d*%d matrix a:",m,n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &a[i*m+j]);
    printf("Input %d*%d matrix b:",m,n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++){
            scanf("%d", &b[i*m+j]);
            a[i*m+j] += b[i*m+j];
        }
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            printf("%6d", a[i*m+j]);
        }
        printf("\n");
    }
    free(a);
    free(b);
}


scanf("%d", &a[i*m+j]);
这里应该是i*n+j

所有im+j的地方都要改成in+j

所有的i * m + j都改为 i * n + j
n才是列数量

#include<stdio.h>
#include<stdlib.h>
int main(void)
{
    int m, n, *a, *b, i, j;
    printf("Input m, n:");
    scanf("%d,%d", &m, &n);
    a = (int *)malloc(m * n * sizeof(int));
    b = (int *)malloc(m * n * sizeof(int));
    printf("Input %d*%d matrix a:",m,n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++)
            scanf("%d", &a[i*n+j]);
    printf("Input %d*%d matrix b:",m,n);
    for (i = 0; i < m; i++)
        for (j = 0; j < n; j++){
            scanf("%d", &b[i*n+j]);
            a[i*n+j] += b[i*n+j];
        }
    for (i = 0; i < m; i++){
        for (j = 0; j < n; j++){
            printf("%6d", a[i*n+j]);
        }
        printf("\n");
    }
    free(a);
    free(b);
}