我试图用C实现一个环形缓冲区。我声明一个带有一些参数的结构ring_buffer,一个指向ring_buffer元素的指针数组,以及一个释放缓冲区元素的回调函数(指针)。
struct ring_buffer
{
size_t size, count, head;
void **elems;
void (*free_callback)(void *p);
};
typedef struct ring_buffer ring_buffer;此外,我还获得了一个init函数来创建结构的一个新实例。
ring_buffer *init_buffer(const size_t n, void (*f)(void *p))
{
ring_buffer *buffer = NULL;
size_t count = 0, head = 0;
void **elems = NULL;
if(n <= 0 || f == NULL)
{
return NULL;
}
buffer = malloc(sizeof(buffer));
elems = (void**)malloc(n * sizeof(void*));
*buffer = (ring_buffer){.size = n, .count = count, .head = head, .elems = elems, .free_callback = f};
return buffer;
}现在,我遇到了以下问题:在调用init_buffer函数并创建新结构之后,回调函数的指针被放置在结构的free_callback成员和elems数组的第一个索引上!意思是free_callback == elems[0]。
我对此感到非常困惑,因为我为整个数组和结构分配了足够的空间,所以为什么free_callback指针与数组的第一个索引重叠。
任何帮助都是非常感谢的!
发布于 2019-11-24 14:06:42
buffer = malloc(sizeof(buffer));您分配的存储空间的大小为指针,而不是环形缓冲区。请重写:
buffer = malloc(sizeof(ring_buffer))https://stackoverflow.com/questions/59018358
复制相似问题