C : Insert/get 元素 in/from 空数组

C : Insert/get element in/from void array

我必须创建一个可以包含通用数据结构的通用数组。 如何将通用结构放入 void 数组的空槽中?

这是我的代码。

struct CircularBuffer {
    int E;
    int S;
    int length;   // total number of item allowable in the buffer
    int sizeOfType;   // size of each element in the buffer
    void *buffer;
};

struct CircularBuffer* circularBufferInit(int length, int sizeOfType) {

    struct CircularBuffer *cb = malloc(sizeof(struct CircularBuffer));
    cb->E = 0;
    cb->S = 0;
    cb->length = length;
    cb->sizeOfType = sizeOfType;
    cb->buffer = malloc(sizeOfType *length);
    return cb;
}

int circularBufferIsEmpty(struct CircularBuffer* cb) {
    if (cb->S == cb->E)
        return 1; //empty
    else
        return 0;
}

int circularBufferIsFull(struct CircularBuffer *cb) {
    int nE = (cb->E + 1) % (cb->length);
    if (nE == cb->S)
        return 1; //full
    else
        return 0;
}

void circularBufferAdd(struct CircularBuffer *cb, void* obj) {
    memcpy(cb->buffer + cb->E, obj, cb->sizeOfType);
}
[...]

memcpy 是问题...

看来您本质上是想弄清楚如何将 void * 偏移到已知大小但类型未知的数组元素的地址,以便将其传递给 memcpy()

看起来好像在circularBufferAdd()中,cb->E给出了要复制到的元素的索引,cb->buffer是数组的void *obj 是要复制的项目,cb->sizeOfType 是每个数组元素的大小(和 obj)。在这种情况下,您可以更改:

    memcpy(cb->buffer + cb->E, obj, cb->sizeOfType);

至:

    memcpy((char *)cb->buffer + (cb->E * cb->sizeOfType), obj, cb->sizeOfType);

由于您不能对 void * 使用指针运算,因此您将其转换为 char *。然后,您可以将元素索引乘以元素大小以获得以字节为单位的元素偏移量,并使用它来获取所需元素的地址。