首页 > 解决方案 > 将 void* 复制到数组中的某个位置,C

问题描述

我有这个结构:

typedef struct {
    int size;
    int capacity;
    int element_size;
    void* data;
} array;

而且我有一个函数可以将一个 void ptr 附加到数据中。正如您所看到的,大小每次都会增加,因此数据不会被覆盖。我正在尝试根据数组的当前大小将 data_ptr 复制到数据数组中。但是这个值是不可赋值的。我已经使用 memcpy 进行了这项工作,但我只想复制指针而不是它指向的内容。有小费吗?

array alloc_array(int capacity, int element_size) {
    void* data_alloc = malloc(capacity * element_size);
    return (array) {.size = 0, .capacity = capacity, .element_size = element_size, .data = data_alloc};
}

void append(array* arr, void* data_ptr) {
    arr->data + (arr->size * arr->element_size) = data_ptr;
    arr->size++;
}

标签: cmemory-management

解决方案


我假设您要附加一个由data_ptr. 不是data_ptr指针本身。

只需使用重新分配。


void append(array* arr, void* data_ptr) {
    
    if (arr->size + 1 > arr->capacity) {
       size_t new_capacity = arr->capacity + 1; // consider 1+2*arr->capacity
       void *new_data = realloc(arr->data, new_capacity * arr->element_size);
       if (!new_data)
         .. error handling ...
       // update resized arr
       arr->capacity = new_capacity;
       arr->data = new_data;
    }
    // find pointer to a new element at the end of new_data
    char *dst = (char*)arr->data + data->size * arr->element_size;
    // copy new element there
    memcpy(dst, data_ptr, arr->element_size);
    arr->size++;
}

如果你想添加指针本身,只需将上面的函数包装在帮助器中:

void append_ptr(array* arr, void* ptr) {
   append(arr, &ptr);
}

请确保arr->element_size == sizeof (void*)


推荐阅读