我正在为Windows命令行编写一个基于控制台的小应用程序。
我为两个阵列分配内存,chi
和chi_comp
,如下所示:
/* allocating memory for chi */
if ((chi = (int *)malloc(cm * sizeof(int))) == NULL)
{
printf("Error allocating %i bytes of memory.\n", lm * sizeof(int));
return CMD_NONE;
}
/* allocating memory for chi_comp */
if ((chi_comp = (int *)malloc(cm * sizeof(int))) == NULL)
{
printf("Error allocating %i bytes of memory.\n", cm * sizeof(int));
return CMD_NONE;
}
稍后在代码中我初始化它们
for (i = 0; i < cm; i++)
{
chi[i] = -1;
chi_comp[i] = -1;
}
并像
一样使用它们chi[grade] = i;
chi_comp[i] = grade;
和
if (chi_comp[i] != -1)
{
printf(" %i ", v[chi_comp[i]][0]);
}
使用它们可以正常工作但是当我尝试释放内存时,我不再需要它,程序崩溃了。
free(chi);
free(chi_comp);
使用gdb进行调试会产生以下结果:
在这种情况下,警告:HEAP [m.exe]: 警告:003518B8处的堆块在003518CC处修改,超过了请求的c
大小编程接收信号SIGTRAP,跟踪/断点陷阱。 ntdll中的0x776f0b2d!RtlpNtEnumerateSubKey() 来自C:\ Windows \ system32 \ ntdll.dll
chi值003518C0
和chi_comp值003518E8
答案 0 :(得分:2)
从错误消息:
警告:HEAP [m.exe]:警告:003518B8的堆块在003518CC处修改,超过了请求的c大小
我怀疑你的代码中某处出了界,所以请检查你的柜台。什么告诉我过去要求的大小。确保您阅读了两次错误消息,它们是为了您自己的利益。 :)
下次发帖时,请务必提供苦味的最小例子。
答案 1 :(得分:2)
在问题下方comments之后,
在你的代码中,似乎是说
chi[grade] = i;
你出界了。访问超出范围的内存会调用undefined behavior。您应该检查
if (grade < cm)
chi[grade] = i;