结构中的指针放置在两个结构成员上

问题描述 投票:0回答:1

[我正在尝试用C实现一个环形缓冲区。我声明一个带有某些参数的struct 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指针与数组的第一个索引重叠。

感谢您的任何帮助!

c arrays pointers struct
1个回答
0
投票
buffer = malloc(sizeof(buffer));
您使用指针的大小而不是环形缓冲区分配存储空间。请重写:

buffer = malloc(sizeof(ring_buffer))

© www.soinside.com 2019 - 2024. All rights reserved.