0xC0000374:堆已损坏(参数:0x77AAB960)

0xC0000374:堆已损坏(参数:0x77AAB960),c,C,下面的代码有时会引发类似以下情况的异常: Matriks.exe中0x779CC19E(ntdll.dll)处引发异常:0xC0000005:访问冲突读取位置0x0000001D 我是C语言的新手,刚学会使用指针。有什么建议吗?我的代码中还有其他值得批评的问题吗 #include <stdio.h> #include <stdlib.h> #include <time.h> main() { int *Matrix_01, *Matrix_02;

下面的代码有时会引发类似以下情况的异常:

Matriks.exe中0x779CC19E(ntdll.dll)处引发异常:0xC0000005:访问冲突读取位置0x0000001D

我是C语言的新手,刚学会使用指针。有什么建议吗?我的代码中还有其他值得批评的问题吗

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

main()
{
    int *Matrix_01, *Matrix_02;
    int a, b, i, n,valid=1;
    srand(time(0));
    do 
    {
        printf("Insert number of rows: ");
        scanf("%d", &a);
        printf("Insert number of columns: ");
        scanf("%d", &b);
        if (a >= 0 && b >= 0)
            valid = 0;
        else
        {
            printf("Invalid input!");
            system("pause>null & cls");
        }
    } while (valid == 1);

    Matrix_01 = (int *)malloc(a * b * sizeof(int));
    Matrix_02 = (int *)malloc(a * b * sizeof(int));
    for (i = 0; i < a; i++)
        for (n = 0; n < b; n++)
        {
            Matrix_01[a*i + n] = rand() % 50;
            Matrix_02[a*i + n] = rand() % 50;
        }
    printf("\nFirst Matrix:\n");
    for (i = 0; i < a; i++)
    {
        printf("\n");
        for (n = 0; n < b; n++)
        {
            printf("%4d", Matrix_01[a*i + n]);
        }
    }
    printf("\n\nSecond Matrix:\n");
    for (i = 0; i < a; i++)
    {
        printf("\n");
        for (n = 0; n < b; n++)
        {
            printf("%4d", Matrix_02[a*i + n]);
        }
    }
    printf("\n\nAddition:\n");
    for (i = 0; i < a; i++)
    {
        printf("\n");
        for (n = 0; n < b; n++)
        {
            printf("%4d", Matrix_01[a*i + n]+Matrix_02[a*i + n]);
        }
    }
    printf("\n\nSubtraction:\n");
    for (i = 0; i < a; i++)
    {
        printf("\n");
        for (n = 0; n < b; n++)
        {
            printf("%4d", Matrix_01[a*i + n] - Matrix_02[a*i + n]);
        }
    }
    printf("\n");
    system("pause>null");
} 
#包括
#包括
#包括
main()
{
int*Matrix_01,*Matrix_02;
int a,b,i,n,valid=1;
srand(时间(0));
做
{
printf(“插入行数:”);
scanf(“%d”和“&a”);
printf(“插入列数:”);
scanf(“%d”和“b”);
如果(a>=0&&b>=0)
有效=0;
其他的
{
printf(“无效输入!”);
系统(“暂停>空和cls”);
}
}而(有效==1);
矩阵_01=(int*)malloc(a*b*sizeof(int));
矩阵_02=(int*)malloc(a*b*sizeof(int));
对于(i=0;i空”);
} 

堆已损坏,在这种情况下意味着您写入了有效分配的区域

检查索引的最小值和最大值:

  • i
    范围从
    0
    a-1
  • n
    范围从
    0
    b-1
因此
a*i+n
的范围从
0
a*(a+1)+b
。所以它与矩阵维数不匹配。如果
a
大于
b
内存将损坏

您需要将其替换为
b*i+n
(范围从
0
b*(a-1)+b
=>
a*b

您还希望避免在读取输入时允许
a
b
为零。实际上,最好通过检查返回码来检查
scanf
是否成功扫描了一个值,然后检查值是否大于零(但不等于零)
或者使用2D矩阵(或一次行上的计算指针以避免这些计算)

为什么要动态更改代码?请发布生成确切错误的确切代码,而不是一些“调整”的代码。如果(a>=0&&b>=0,我运行此操作没有任何问题,请编写输入数字和主机环境
这不是一个好的测试。你不希望a或b是0索引是错误的:
a*i+n
=>
b*i+n
@Jean-Françoisfare整个
有效的
事情似乎颠倒了