【发布时间】:2021-08-31 22:02:08
【问题描述】:
我正在为泛型类型开发一个动态数组实现。我的理解是realloc的无效指针错误通常是由于没有使用malloc分配原始指针引起的,但是我使用的是malloc。
这是我的 array.h 代码
#include <stdlib.h>
#include <stdint.h>
#include <inttypes.h>
struct array {
void *elems;
size_t obj_size;
size_t size;
size_t capacity;
};
struct array* new_array(size_t objsize);
int push_back(struct array* a, const void* value);
数组.c
#include "array.h"
#include <stdio.h>
#include <string.h>
#define INITIAL_SIZE (1)
#define ARR_AT(a, i) ((void *) ((char *) (a)->elems + (i) * (a)->obj_size))
struct array* new_array(size_t objsize) {
struct array* a;
a = malloc(sizeof a + INITIAL_SIZE * objsize);
if (!a) { return NULL; }
a->elems = malloc(objsize);
a->capacity = 1;
a->size = 0;
return a;
}
int push_back(struct array* a, const void* value) {
if (a->size == a->capacity) {
void* temp = realloc(a->elems, a->obj_size * a->capacity * 2);
a->elems = temp;
if (!a) { return -1; }
a->capacity = a->capacity * 2;
}
memcpy(ARR_AT(a, a->size), value, a->obj_size);
a->size++;
return 0;
}
main.c
#include "array.h"
#include <stdio.h>
int main(void) {
struct array* a = new_array(4);
uint32_t* b = (uint32_t*) 3;
push_back(a, b);
printf("Size: %ld \n", a->size);
for (int i = 0; i < 30; i++) {
push_back(a, b + i);
printf("Size: %ld \n", a->size);
}
return 0;
}
我一直在尝试修复此错误,但我的 C 技能欠佳。我在这里错过了什么?
【问题讨论】:
-
a->obj_size从未设置,因此realloc可能由于大小无效而失败。当您检查错误的指针时,您也不会发现:if (!a)应该是if (!temp)或if (!a->elems) -
天哪,真是个愚蠢的错误。谢谢。
-
如果无法分配请求的空间,
realloc()也会失败。您的程序需要保存旧指针,因为在这种情况下它不会被释放。 -
如果您使用调试器(如 gdb),那么问题会在几分钟内显示出来
标签: c dynamic-arrays realloc