【发布时间】:2017-03-15 14:12:38
【问题描述】:
我正在尝试实现一个必须具有以下结构的动态数组:
typedef struct DArray{
void **array;
int capacity;
int size;
void (*display)(FILE *, void *); //function pointer to a non-generic display function
} DArray;
但是,在当前行为下,数组似乎没有调整大小,并且每当我尝试访问不为零的索引时都会引发段错误。构造函数和插入函数如下:
DArray *newDArray(void (*d)(FILE *,void *)){
DArray *myDarray = malloc(sizeof(DArray));
myDarray->array = malloc(sizeof(void *)); //size = 1 for now, otherwise multiply by array length
myDarray->capacity = 1;
myDarray->size = 0;
myDarray->display = d;
return myDarray;
}
void insertDArray(DArray *a,void *v){
if (a->size < a->capacity)
a->array[a->size] = v;
else{
void **newArray = malloc(sizeof(void *) * a->capacity * 2); //double size
for (int i = 0; i <= a->size; i++)
newArray[i] = a->array[i]; //clone old array
a->capacity = a->capacity * 2;
free(a->array);
a->array = newArray;
}
a->size++;
}
我在这里无法理解我的指示。我认为正在发生的事情是指向 a->array 的指针仍然指向旧的、未调整大小的数组,但是执行 *a->array = newArray; 也不起作用。任何人都可以对此有所了解吗?
【问题讨论】:
-
单次启动 (
void*) 不够用的任何理由? -
@StoryTeller 必须实现数组以处理通用 (void*) 类型。我相信我应该有一个指针数组,因此是双星。
-
如果将指针插入数组,则不需要
size成员。如果插入对象,则不需要指针数组 -
与您的问题无关,但为什么要单独
malloc后跟一个复制循环?为什么不使用realloc?毕竟也许不是那么不相关,因为使用realloc会顺便解决你的问题。 -
@StoryTeller 你能解释一下为什么我不需要 size 会员吗?
标签: c pointers memory-management dynamic-arrays dynamic-allocation