FAIRYFAR-INTERNAL
 
  FAIRYFAR-INTERNAL  |  SITEMAP  |  ABOUT-ME  |  HOME  
C语言伸缩性数据成员使用注意事项

伸缩性数组成员(Flexible Array Member),又名柔性数组成员或者弹性数组成员。

注意事项

定义必须遵照以下规定:

伸缩性数组成员必须是结构体最后一个成员变量,否则伸缩性数组成员的内存空间会覆盖结构体其它成员变量。

测试用例

以下是违反上述“规定”的测试用例:

snippet.c
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
 
#define FLEXIBLE_ARRAY_MEMBER 0
 
typedef struct 
{
	int a;
	char data[FLEXIBLE_ARRAY_MEMBER];
} st_1;
 
typedef struct
{
	st_1 c;  // 空间覆盖了其它成员变量
	int b;
} st_2;
 
int main(int argc, char **argv)
{
	st_2 *s2 = malloc(sizeof(st_2) + sizeof(char) * 8);
	s2->b = 100;
	memset(s2->c.data, 0, sizeof(char) * 8);
	printf("%d\n", s2->b);
	return 0;
}

以上测试用例输出结果为0,而不是100。

snippet.bash
[yz@bogon flex_ary]$ gcc -g -o test test.c
[yz@bogon flex_ary]$ ./test
0


打赏作者以资鼓励:
移动端扫码阅读: