下面的代码有时会抛出类似于以下内容的异常:
在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");
}
答案 0 :(得分:1)
在这种情况下,堆损坏意味着您写出了有效的已分配区域。
检查索引的最小值和最大值:
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
为零。实际上,最好通过检查返回码 then 来检查scanf
是否成功扫描了一个值,然后检查值是否大于零(但不相等)
或使用2D矩阵(或在行上计算一次指针以避免这些计算)