带 void 的动态数组内存分配**
Dynamic Array Memory Allocation with void**
我正在尝试实现一个必须具有以下结构的动态数组:
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;
也不起作用。任何人都可以阐明这一点吗?
您遇到了由此循环导致的缓冲区溢出。应该是 i < a->size
因为如果 capacity 是 5,你只在 size 也是 5 时扩展它,因此你将访问数组中的第 6 个元素。
for (int i = 0; i <= a->size; i++)
您在调整大小时也没有添加新值。可能按照...
更改代码的逻辑
if (a->size == a->capacity)
{
/* resize array */
}
a->array[a->size++] = v;
...注意检查使用 malloc
或 realloc
等的结果...
我正在尝试实现一个必须具有以下结构的动态数组:
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;
也不起作用。任何人都可以阐明这一点吗?
您遇到了由此循环导致的缓冲区溢出。应该是 i < a->size
因为如果 capacity 是 5,你只在 size 也是 5 时扩展它,因此你将访问数组中的第 6 个元素。
for (int i = 0; i <= a->size; i++)
您在调整大小时也没有添加新值。可能按照...
更改代码的逻辑if (a->size == a->capacity)
{
/* resize array */
}
a->array[a->size++] = v;
...注意检查使用 malloc
或 realloc
等的结果...