如何解决GDB的错误“为RtlFreeHeap指定了无效的地址”

时间:2019-08-14 12:02:52

标签: c gdb

在处理一段C代码时遇到一些麻烦。 这是我的代码:

typedef struct ARRAY {
    int length;
    int* values;
} ARRAY;


ARRAY* ARRAY_init(int length) {
    ARRAY* a = malloc(sizeof(ARRAY));
    a->values = malloc(length * sizeof(int));
    for (int i = 0; i < length; i++) {
        a->values[i] = 0;
    }
    a->length = length;
    return a;
}


void ARRAY_free(ARRAY* a) {
    free(a->values);
    free(a);
}


void ARRAY_extend(ARRAY* a, int k) {
    a->values = realloc(a->values, a->length + k);
    for (int i = a->length; i < a->length + k; i++) {
        a->values[i] = 0;
    }
    a->length += k;
}


int main() {
    ARRAY* a = ARRAY_init(3);
    ARRAY_extend(a, 2);
    ARRAY_free(a);
}

当我用gdb运行这段代码时,我得到一个
warning: Heap block at 00AD16B8 modified at 00AD16CC past requested size of 5
然后是
warning: Invalid address specified to RtlFreeHeap( 00AD0000, 00AD16C0 ) 错误似乎在realloc ......期间发生。
仍然我不明白我的代码有什么问题。有人可以向我解释吗?

1 个答案:

答案 0 :(得分:0)

realloc将输入作为要分配的字节数。

   a->values = realloc(a->values, a->length + k);

应该是

   a->values = realloc(a->values, sizeof(int) * (a->length + k));

到目前为止,您只是分配5个字节,但您要分配5 * sizeof(int)个字节。


或更妙的是

    int *temp = realloc(a->values, sizeof(int) * (a->length + k));
    if (temp) {
       a->values = temp;
       a->length += k;
    }
    else {
       //error
    }