我正在用 C 编写一个环形缓冲区库,并且我试图通过创建 typedef 结构的“对象”来使拥有多个环形缓冲区成为可能。这是我的 .h 库中的结构:
//ringbuffer.h
// declare variables in struct
typedef struct Ringbuffer
{
int* buff; // ring buffer
int buffSize; // ring buffer size
// more vars here
}ringbuffer;
这就是我初始化缓冲区及其大小并释放内存的方式。
//ringbuffer.c
//initialize buffer
void ringbuffer_init(int buff_size, ringbuffer *a)
{
// allocate memory to buffer
a->buff = malloc(buff_size * sizeof(int));
}
// empty the buffer
void ringbuffer_empty(ringbuffer *a)
{
free(a->buff);
}
为了与 C++ 并行,我想初始化它,这样我就可以在 C 中编写等同于 Ringbuffer buffer1;
和 Ringbuffer buffer2
的东西。现在我这样解决这个问题:
// example.c
#include "ringbuffer.h"
#define BUFFER_SIZE 10
int main(void)
{
// create two ringbuffer instances by allocating memory
ringbuffer* buff1 = malloc(sizeof(ringbuffer));
ringbuffer* buff2 = malloc(sizeof(ringbuffer));
// initialize the two buffers
ringbuffer_init(BUFFER_SIZE, buff1);
ringbuffer_init(BUFFER_SIZE, buff2);
// use the buffers in some way here
free(buff1);
free(buff2);
}
这意味着我的库的用户必须分配内存并释放它。这似乎不是一个好的实现。我怎样才能以更微妙的方式做到这一点?
完整的 .h、.c 和 example.c 文件可以在我的 GitHub 上找到.
最佳答案
您可以采用面向对象的方法并创建一个构造函数来初始化结构并返回指向新分配内存的指针。
例子:
struct Ringbuffer *Ringbuffer_create()
{
struct Ringbuffer *self = malloc(sizeof(struct Ringbuffer))
/* Initiate the other struct members here too */
...
return self;
}
在主文件中你可以写以下内容:
struct ringbuffer *buff1 = Ringbuffer_create();
我还建议创建一个析构函数,以便您可以轻松销毁“对象”。
void Ringbuffer_destroy(struct Ringbuffer **self)
{
/* Free the allocated memory here */
}
关于c - 如何在 C 中创建结构的 "objects",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57471924/