释放内存时堆损坏



这是我的代码:

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] ='';
    *edge = (int)strtol(ch_number, &error ,10);
    if(error[0] != '') 
    {
        free(ch_number);
        return 0;   
    }
    free(ch_number);
    return 1;
}

调试器显示free(ch_number);使堆损坏。我做错了什么?下面是使用:

的示例15643 ->

load_data("45545546",和顶点和边),

C数组是从零开始的,所以

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

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

如果您想在ch_number中添加一个空终止符,您需要分配一个额外的内存字节

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

相关内容

  • 没有找到相关文章