柔性数组
柔性数组的定义
柔性数组必须是结构体的最后一个成员,且不能指定大小:
struct flex_array
{
int length; // 用于记录数组元素数量
int data[]; // 柔性数组,不指定大小
};
柔性数组的特点
- 柔性数组只能作为结构体的最后一个成员
- 柔性数组不占用结构体的存储空间
- 通过结构体指针访问柔性数组
- 需要动态分配内存来使用柔性数组
使用示例
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义包含柔性数组的结构体
struct flex_buffer {
size_t size; // 缓冲区大小
char data[]; // 柔性数组
};
// 创建一个柔性数组缓冲区
struct flex_buffer* create_buffer(size_t size) {
// 分配内存:结构体大小 + 柔性数组所需大小
struct flex_buffer* buf = malloc(sizeof(struct flex_buffer) + size);
if (buf) {
buf->size = size;
// 初始化柔性数组内容为0
memset(buf->data, 0, size);
}
return buf;
}
// 使用柔性数组
void use_buffer() {
// 创建一个能存储100个字符的缓冲区
struct flex_buffer* buffer = create_buffer(100);
if (!buffer) {
printf("内存分配失败\n");
return;
}
// 向柔性数组中写入数据
strcpy(buffer->data, "这是一个柔性数组的示例");
printf("缓冲区大小: %zu\n", buffer->size);
printf("缓冲区内容: %s\n", buffer->data);
// 释放内存
free(buffer);
}
int main() {
use_buffer();
return 0;
}
柔性数组的优点
- 内存连续性:结构体和数组元素在内存中是连续的,有利于提高访问效率
- 内存管理简单:只需一次 malloc 和一次 free 操作
- 避免指针带来的额外开销:相比使用指针成员,柔性数组不需要额外的指针存储空间
注意事项
- 柔性数组必须是结构体的最后一个成员
- 不能有多个柔性数组
- 不能直接使用 sizeof 获取包含柔性数组的结构体总大小
- 必须通过动态内存分配来使用柔性数组
柔性数组特别适合用于创建可变大小的缓冲区、数据包结构等需要动态调整大小的数据结构。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 宋振威的博客!
评论
