在释放内存C时堆积损坏

时间:2013-06-14 19:02:05

标签: c debugging malloc free heap-corruption

这是我的代码:

int load_data(char *line, int *vertex, int *edge)
{
    char *ch_number = NULL;
    char *error = NULL;

    *vertex = (int)strtol(line, &error ,10);
    if((error[0] != '-') && (error[1] != '>')) return 0;

    ch_number = (char*)malloc(sizeof(char) * (strlen(error) - 2));

    memcpy(ch_number, &error[2], strlen(error) - 2);
    ch_number[strlen(error) - 2] ='\0';

    *edge = (int)strtol(ch_number, &error ,10);

    if(error[0] != '\0') 
    {
        free(ch_number);
        return 0;   
    }
    free(ch_number);
    return 1;
}

调试器显示free(ch_number);使堆损坏。 我究竟做错了什么? 这是使用的示例:

load_data( “15643-> 45545546”,&安培;顶点,&安培;边缘);

1 个答案:

答案 0 :(得分:3)

C数组基于零,因此行

 ch_number[strlen(error) - 2] ='\0';

ch_number的末尾写入一个字节。这样做的效果是未定义的,但听起来你已经写入了堆管理器用来检测这种腐败的保护词。

如果要向ch_number添加空终止符,则需要分配额外的内存字节

ch_number = malloc(strlen(error) - 1);