这是我的代码:
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);