信号SIGTRAP免费崩溃

时间:2016-01-18 10:23:32

标签: c memory segmentation-fault malloc free

我正在为Windows命令行编写一个基于控制台的小应用程序。

我为两个阵列分配内存,chichi_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

2 个答案:

答案 0 :(得分:2)

从错误消息:

  

警告:HEAP [m.exe]:警告:003518B8的堆块在003518CC处修改,超过了请求的c大小

我怀疑你的代码中某处出了界,所以请检查你的柜台。什么告诉我过去要求的大小。确保您阅读了两次错误消息,它们是为了您自己的利益。 :)

下次发帖时,请务必提供苦味的最小例子。

答案 1 :(得分:2)

在问题下方comments之后,

在你的代码中,似乎是说

 chi[grade] = i;

你出界了。访问超出范围的内存会调用undefined behavior。您应该检查

 if (grade < cm)
       chi[grade] = i;