c - C中的动态数组和指针

标签 c arrays pointers struct

我是 C 语言和编程的初学者。我想请教一些关于C中动态数组和指针的问题。
我正在尝试创建一个动态数组并增加其容量,但我无法让我的代码正常工作。我认为我的 setCapacityDynArr 函数有问题。

有人可以帮我吗? 谢谢!

struct DynArr {
    TYPE *data; /* pointer to the data array */
    int size; /* Number of elements in the array */
    int capacity; /* capacity ofthe array */
};

void initDynArr(struct DynArr *v, int capacity) {
    v->data = malloc(sizeof(TYPE) * capacity);
    assert(v->data != 0);
    v->size = 0;
    v->capacity = capacity;
}

void freeDynArr(struct DynArr *v) {
    if (v->data != 0) {
        free(v->data); /* free the space on the heap */
        v->data = 0; /* make it point to null */
    }
    v->size = 0;
    v->capacity = 0;
}

int sizeDynArr(struct DynArr *v) {
    return v->size;
}

void addDynArr(struct DynArr *v, TYPE val) {
    /* Check to see if a resize is necessary */
    if (v->size >= v->capacity) {
        _setCapacityDynArr(v, 2 * v->capacity);
    }
    v->data[v->size] = val;
    v->size++;
}

void _setCapacityDynArr(struct DynArr *v, int newCap) {
    //create a new array
    struct DynArr *new_v;
    assert(newCap > 0);
    new_v = malloc(newCap * sizeof(struct DynArr));
    assert(new_v != 0);
    initDynArr(new_v, newCap);

    //copy old values into the new array
    for (int i = 0; i < new_v->capacity; i++) {
        new_v->data[i] = v->data[i];
    }

    //free the old memory
    freeDynArr(v);

    //pointer is changed to reference the new array
    v = new_v;

}

int main(int argc, const char * argv[]) {

    //Initialize an array
    struct DynArr myArray;
    initDynArr(&myArray, 5);
    printf("size = 0, return: %d\n", myArray.size);
    printf("capacity = 5, return: %d\n", myArray.capacity);

    //Add value to the array
    addDynArr(&myArray, 10);
    addDynArr(&myArray, 11);
    addDynArr(&myArray, 12);
    addDynArr(&myArray, 13);
    addDynArr(&myArray, 14);
    addDynArr(&myArray, 15);

    for (int i = 0; i < myArray.size; i++) {
        printf("myArray value - return: %d\n", myArray.data[i]);
    }

    return 0;
}

最佳答案

//pointer is changed to reference the new array
v = new_v;

这是你的问题,C 中的一个经典错误。事实上,函数更改了它自己的指针副本,调用者永远看不到更改。 C FAQ 充分描述了这个问题.

我建议采用不同的方法。没有理由创建一个新的 v:您只是想要更多的存储空间 与之关联。因此,与其实际更改 v,您可能只想调用存储上的 realloc:v->DATA

你可能会逃脱这样的事情:

tmp = realloc(v->data, newCap * sizeof *v->data);
if (!tmp)
    error;

v->data = tmp;

这样您也不需要复制元素:realloc 会处理这些。

关于c - C中的动态数组和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15964605/

相关文章:

c - 为什么这个链表初始化不起作用?

java - 如何从字符串数组生成HBase java Put类?

javascript - 我想按字母顺序生成唯一的字母键 |angularJs

c - KL25 DAC 驱动器在示波器上显示无输出

c - 如何通过传递两个参数的递归来反转数组?

c - 将格式说明符存储在指针中

c - 如何将动态大小的指针引用到数组?

c - 如何在 C 函数中使用全局结构引用填充结构指针?

c - freopen() 和流的奇怪行为

php - 如何找到包含在数组中的值中的值?