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 *
。然后,您可以将元素索引乘以元素大小以获得以字节为单位的元素偏移量,并使用它来获取所需元素的地址。
我必须创建一个可以包含通用数据结构的通用数组。 如何将通用结构放入 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 *
。然后,您可以将元素索引乘以元素大小以获得以字节为单位的元素偏移量,并使用它来获取所需元素的地址。