在处理一段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
......期间发生。
仍然我不明白我的代码有什么问题。有人可以向我解释吗?
答案 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
}