举个简易环形缓冲的例子,存储区存储数据为结构体指针,不要使用malloc生成存储区,使用数组,然后写出完整示例
时间: 2024-03-21 15:43:27 浏览: 49
好的,这里提供一个简单的环形缓冲的示例代码,存储区存储数据为结构体指针,使用数组实现:
```c
#include <stdio.h>
#define BUFFER_SIZE 10 // 环形缓冲区大小
typedef struct {
int a;
char b;
} Data;
typedef struct {
Data *buffer[BUFFER_SIZE]; // 存储区
int head; // 缓冲区头部
int tail; // 缓冲区尾部
int size; // 缓冲区大小
} CircularBuffer;
// 初始化环形缓冲区
void initCircularBuffer(CircularBuffer* cb) {
cb->head = 0;
cb->tail = 0;
cb->size = BUFFER_SIZE;
}
// 写入数据到环形缓冲区
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(&cb);
Data data1 = {1, 'a'};
Data data2 = {2, '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);
return 0;
}
```
在示例代码中,我们定义了一个 `CircularBuffer` 结构体,它包含了一个存储区 `buffer`,以及头部 `head`、尾部 `tail` 和大小 `size` 三个变量。在 `initCircularBuffer` 函数中,我们初始化了头部和尾部为 0,大小为 `BUFFER_SIZE`。在 `writeData` 函数中,我们首先计算出下一个尾部的位置,如果下一个尾部的位置等于头部的位置,说明缓冲区已满,直接返回 -1。否则,将传入的数据指针存储到当前尾部的位置,更新尾部的位置,并返回 0。在 `readData` 函数中,如果头部和尾部相等,则说明缓冲区为空,直接返回 NULL。否则,取出头部位置的数据指针,更新头部位置,并返回数据指针。在 `main` 函数中,我们首先初始化了一个大小为 `BUFFER_SIZE` 的环形缓冲区,然后定义了两个 `Data` 结构体,并分别赋值,然后调用 `writeData` 函数将数据写入缓冲区。接着,调用 `readData` 函数读取数据,并打印读取到的数据。
阅读全文