我必须创建一个可以包含通用数据结构的通用数组。
如何将通用结构放入 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
is the void *
到数组,obj
是要复制的项目,并且cb->sizeOfType
是每个数组元素的大小(并且obj
)。在这种情况下,您可以更改:
memcpy(cb->buffer + cb->E, obj, cb->sizeOfType);
to:
memcpy((char *)cb->buffer + (cb->E * cb->sizeOfType), obj, cb->sizeOfType);
因为你不能使用指针算术void *
,你会把它投射到char *
。然后,您可以将元素索引乘以元素大小以获得元素的偏移量(以字节为单位),并使用它来获取所需元素的地址。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)