c - struct 中的指针放在两个 struct 成员上
问题描述
我正在尝试用 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 指针与数组的第一个索引重叠。
任何帮助表示赞赏!
解决方案
buffer = malloc(sizeof(buffer));
您使用指针大小而不是环形缓冲区分配存储空间。请改写:
buffer = malloc(sizeof(ring_buffer))
推荐阅读
- ubuntu - 如何在我的 Ubuntu 机器上安装 Velero 客户端?
- outlook-redemption - Outlook Redemption - 从本地文件夹打开 .msg 文件时出现权限问题 (System.UnauthorizedAccessException)
- azure - 用于 Key Vault 的 Powershell 中的非交互式登录
- spartacus-storefront - 将从 spartacus-storefront 中删除 bootstrap
- sql - 如何每月自动计算 MS Access DB 2016 中的新字段(列)
- java - Spring Boot中SessionCookieConfig的默认设置值是多少,如何设置?
- notifications - 单击通知时,电子通知不会再次将应用程序置于最前面
- r - 如何在R中提取字符串的最大值
- java - mvn clean package 错误:此环境中未提供编译器。也许您在 JRE 而不是 JDK 上运行?
- python - Python中的FFT - 错误的数据?