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')