c - 如何在 C 中创建结构的 "objects"

标签 c struct

我正在用 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/

相关文章:

c++ - C/C++ 中结构的 `new` 和 `new()` 有什么区别?

c# - C#中的值类型类定义?

c - 在永远不会被命中的 if block 中声明函数级静态变量

c - size_t 预处理器值的大小

c++ - 运算符优先顺序和求值困惑

ios - 如何搜索结构(Swift)

c++ - 结构体、数组和函数 C++

swift - 如何访问结构中的字典

c - 如果 memcpy 实际上不返回任何内容,如何以 memcpy 作为第一个参数调用 memset?

c - 将 size_t 保存在原始内存块中并将其取回