【问题标题】:Dynamic Array Memory Allocation with void**带 void 的动态数组内存分配**
【发布时间】: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-&gt;array = newArray; 也不起作用。任何人都可以对此有所了解吗?

【问题讨论】:

  • 单次启动 (void*) 不够用的任何理由?
  • @StoryTeller 必须实现数组以处理通用 (void*) 类型。我相信我应该有一个指针数组,因此是双星。
  • 如果将指针插入数组,则不需要size 成员。如果插入对象,则不需要指针数组
  • 与您的问题无关,但为什么要单独 malloc 后跟一个复制循环?为什么不使用realloc?毕竟也许不是那么不相关,因为使用realloc 会顺便解决你的问题。
  • @StoryTeller 你能解释一下为什么我不需要 size 会员吗?

标签: c pointers memory-management dynamic-arrays dynamic-allocation


【解决方案1】:

此循环导致缓冲区溢出。应该是i &lt; a-&gt;size,因为如果容量为 5,则只有在大小也为 5 时才扩展它,因此您将访问数组中的第 6 个元素。

for (int i = 0; i <= a->size; i++)

调整大小时也不会添加新值。可能会更改代码的逻辑...

if (a->size == a->capacity)
{
   /* resize array */
}
a->array[a->size++] = v;

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

【讨论】:

  • 谢谢,你是对的。但是,当我在插入两个元素后尝试访问 a->array[1] 时,仍然会出现段错误。我的插入代码中是否有任何可能导致此问题的内容?
  • @ScottSinischo 你能创建一个Minimal, Complete, and Verifiable Example 并告诉我们吗?喜欢你如何使用这些功能?
  • 如果您包含调试器表示发生段错误的哪一行会有所帮助,但我注意到代码原样存在另一个问题并更新了我的答案。
猜你喜欢
  • 2020-08-07
  • 1970-01-01
  • 2021-10-22
  • 1970-01-01
  • 1970-01-01
  • 2021-04-01
  • 2021-04-02
  • 2012-05-04
  • 1970-01-01
相关资源
最近更新 更多