柔性数组
C99中,结构体中最后一个元素允许是未知大小的数组,这叫做 【柔性数组】成员。
例1:
 
struct node {
	int i;
	int num[]; // 柔性数组成员
};
例2:
 
struct node {
	int i;
	int num[0]; // 柔性数组成员
};
柔性数组的特点:
- 结构中的柔性数组成员面前至少有一个其他成员。
- sizeof返回的结构体大小不包含柔性数组成员大小。
- 包含柔性数组成员的结构用 malloc函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组初始大小。
#include <stdlib.h>
#include <stdio.h>
typedef struct node {
	int length;
	int nums[]; // 柔性数组成员
}node;
int main() {
	/*
		sizeof(node) 的结果是4,这4个字节给到i元素
		sizeof(int) * 10 的字节给到了柔性数组成员
	*/
	node* ps = (node*)malloc(sizeof(node) + sizeof(int) * 10);
	if (ps == NULL) {
		perror("malloc:");
		exit(-1);
	}
	ps->length = 10;
	int i = 0;
	for (i = 0; i < ps->length; i++) {
		ps->nums[i] = i;
	}
	// 扩容
	node* new_ps = (node*)realloc(ps , sizeof(node) + sizeof(int) * 20);
	if (new_ps == NULL) {
		perror("realloc:");
		exit(-1);
	}
	ps = new_ps;
	ps->length = 20;
	for (i = 10; i < ps->length; i++) {
		ps->nums[i] = i;
	}
	for (i = 0; i < ps->length; i++) {
		printf("%d ", ps->nums[i]);
	}
	free(ps);
	ps = NULL;
	return 0;
}

柔性数组的好处:
- 方便内存释放。
- 利于访问速度(连续的内存有益于提高访问速度,也有益于减少内存碎片)。



















