C99の柔軟な配列メンバー

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

 

おすすめ

転載: blog.csdn.net/choumin/article/details/114647018