柔性数组的定义

柔性数组必须是结构体的最后一个成员,且不能指定大小:

struct flex_array 
{
    int length;          // 用于记录数组元素数量
    int data[];          // 柔性数组,不指定大小
};

柔性数组的特点

  1. 柔性数组只能作为结构体的最后一个成员
  2. 柔性数组不占用结构体的存储空间
  3. 通过结构体指针访问柔性数组
  4. 需要动态分配内存来使用柔性数组

使用示例

#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;
}

柔性数组的优点

  1. 内存连续性:结构体和数组元素在内存中是连续的,有利于提高访问效率
  2. 内存管理简单:只需一次 malloc 和一次 free 操作
  3. 避免指针带来的额外开销:相比使用指针成员,柔性数组不需要额外的指针存储空间

注意事项

  1. 柔性数组必须是结构体的最后一个成员
  2. 不能有多个柔性数组
  3. 不能直接使用 sizeof 获取包含柔性数组的结构体总大小
  4. 必须通过动态内存分配来使用柔性数组

柔性数组特别适合用于创建可变大小的缓冲区、数据包结构等需要动态调整大小的数据结构。