C99 支持结构体中包含柔性数组成员,它的基本形式如下:
struct data {
int a;
unsigned long b[];
};
在使用时,有下面几点要求:
1)柔性数组成员需要写成:contents[ ] 的形式;
2)由于柔性数组成员的类型不完整,因此无法对该成员进行 sizeof 操作;
3)柔性数组成员只能出现在结构体的最后一个位置;
使用方法:
1)动态分配空间
#include <stdlib.h>
struct data {
int a;
unsigned long b[];
};
int main(void)
{
int i = 0, num = 3;
struct data *d = malloc(sizeof(struct data) + sizeof(unsigned long) * num);
d->a = 1;
for (i = 0; i < num; ++i) {
d->b[i] = (i + 2);
}
return 0;
}
2)静态赋值
#include <stdio.h>
struct data {
int a;
unsigned long b[];
};
struct data d = {1, {[1] = 2021}};
int main(void)
{
printf("d.b[1]: %ld\n", d.b[1]);
return 0;
}
下面这种用法是错误的,因为给 柔性数组成员 赋值的数据不是静态的:
#include <stdio.h>
struct data {
int a;
unsigned long b[];
};
int main(void)
{
struct data d = {1, {[1] = 2021}};
printf("d.b[1]: %ld\n", d.b[1]);
return 0;
}
在编译时会报下面的错误:
$ gcc -o main ./main.c
./main.c: In function 'main':
./main.c:10:9: error: non-static initialization of a flexible array member
struct data d = {1, {[1] = 2021}};
^
./main.c:10:9: error: (near initialization for 'd')