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

时间:2019-11-20 20:10:45

标签: c

下面的代码有时会抛出类似于以下内容的异常:

在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");
} 

1 个答案:

答案 0 :(得分:1)

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

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

  • i的范围从0a-1
  • n的范围从0b-1

因此,a*i + n的范围是0a*(a+1) + b。因此它与矩阵尺寸不匹配。如果a大于b,则内存将损坏。

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

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