举个简易环形缓冲的例子,存储区存储数据为结构体指针,然后写出完整示例
时间: 2024-03-21 09:43:25 浏览: 17
好的,这里提供一个简单的环形缓冲的示例代码,存储区存储数据为结构体指针:
```c
#include <stdio.h>
#include <stdlib.h>
#define BUFFER_SIZE 10 // 环形缓冲区大小
typedef struct {
int a;
char b;
} Data;
typedef struct {
Data **buffer; // 存储区
int head; // 缓冲区头部
int tail; // 缓冲区尾部
int size; // 缓冲区大小
} CircularBuffer;
// 初始化环形缓冲区
CircularBuffer* initCircularBuffer(int size) {
CircularBuffer *cb = (CircularBuffer*)malloc(sizeof(CircularBuffer));
cb->buffer = (Data**)malloc(sizeof(Data*) * size);
cb->head = 0;
cb->tail = 0;
cb->size = size;
return cb;
}
// 销毁环形缓冲区
void destroyCircularBuffer(CircularBuffer* cb) {
free(cb->buffer);
free(cb);
}
// 写入数据到环形缓冲区
int writeData(CircularBuffer* cb, Data* data) {
int nextTail = (cb->tail + 1) % cb->size;
if (nextTail == cb->head) {
// 缓冲区已满
return -1;
}
cb->buffer[cb->tail] = data;
cb->tail = nextTail;
return 0;
}
// 从环形缓冲区读取数据
Data* readData(CircularBuffer* cb) {
if (cb->head == cb->tail) {
// 缓冲区为空
return NULL;
}
Data *data = cb->buffer[cb->head];
cb->head = (cb->head + 1) % cb->size;
return data;
}
int main() {
CircularBuffer *cb = initCircularBuffer(BUFFER_SIZE);
Data *data1 = (Data*)malloc(sizeof(Data));
data1->a = 1;
data1->b = 'a';
Data *data2 = (Data*)malloc(sizeof(Data));
data2->a = 2;
data2->b = 'b';
// 写入数据
writeData(cb, data1);
writeData(cb, data2);
// 读取数据
Data *readData1 = readData(cb);
Data *readData2 = readData(cb);
// 打印读取到的数据
printf("readData1->a: %d, readData1->b: %c\n", readData1->a, readData1->b);
printf("readData2->a: %d, readData2->b: %c\n", readData2->a, readData2->b);
// 销毁环形缓冲区
destroyCircularBuffer(cb);
free(data1);
free(data2);
free(readData1);
free(readData2);
return 0;
}
```
在示例代码中,我们定义了一个 `CircularBuffer` 结构体,它包含了一个存储区 `buffer`,以及头部 `head`、尾部 `tail` 和大小 `size` 三个变量。在 `initCircularBuffer` 函数中,我们分配了存储区的内存空间,并初始化了头部和尾部为 0,大小为传入的参数 `size`。在 `writeData` 函数中,我们首先计算出下一个尾部的位置,如果下一个尾部的位置等于头部的位置,说明缓冲区已满,直接返回 -1。否则,将传入的数据指针存储到当前尾部的位置,更新尾部的位置,并返回 0。在 `readData` 函数中,如果头部和尾部相等,则说明缓冲区为空,直接返回 NULL。否则,取出头部位置的数据指针,更新头部位置,并返回数据指针。在 `main` 函数中,我们首先初始化了一个大小为 `BUFFER_SIZE` 的环形缓冲区,然后分配了两个 `Data` 结构体的内存空间,并分别赋值,然后调用 `writeData` 函数将数据写入缓冲区。接着,调用 `readData` 函数读取数据,并打印读取到的数据。最后,销毁环形缓冲区,并释放所有的数据指针内存空间,避免内存泄漏。