繁体   English   中英

动态数组内存分配与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->数组的指针仍然指向旧的,未表明的数组,但是做*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;

...注意检查使用mallocrealloc等的结果......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM