-1

これは私のコードです:

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",&頂点,&エッジ);

4

1 に答える 1

3

C配列はゼロベースなので、行

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

の最後を超えて 1 バイトを書き込みますch_number。これを行うことの影響は未定義ですが、ヒープマネージャーがこの種の破損を正確に検出するために使用するガードワードに書いたようです。

にヌル ターミネータを追加する場合はch_number、追加のメモリ バイトを割り当てる必要があります。

ch_number = malloc(strlen(error) - 1);
于 2013-06-14T19:03:04.463 に答える