C:在void数组中插入/获取元素

时间:2015-07-30 21:09:22

标签: c arrays generics void memcpy

我必须创建一个可以包含通用数据结构的通用数组。 如何将通用结构放入我的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是问题...

1 个答案:

答案 0 :(得分:2)

基本上,您似乎正在尝试弄清楚如何将void *偏移到已知大小但未知类型的数组元素的地址,以便将其传递给memcpy()

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

obj

为:

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

由于您无法将指针算法与 memcpy((char *)cb->buffer + (cb->E * cb->sizeOfType), obj, cb->sizeOfType); 一起使用,因此请将其转换为void *。然后,您可以将元素索引乘以元素大小以获取元素的偏移量(以字节为单位),并使用它来获取所需元素的地址。