C语言零长度数组(柔性数组)


//柔性数组 (flexible array),
//是指使用动态内存分配为整个结构体增加可操作的连续的内存空间,以达到数组的合法访问内存
struct S{
	int total_size;
	char ch;
	//空数组没有长度,sizeof为0
	int arr[];
};
int main(){
	struct S ps;
	printf("struct_size=%d\n", sizeof(ps));//struct_size=8
	//使用动态内存分配,先为数组分配五个空间
	struct S* ps_Flexible = (struct S*)malloc(sizeof(struct S) + sizeof(int)* 5);
	ps_Flexible->total_size = sizeof(ps)+sizeof(int)* 5;
	ps_Flexible->ch = 'c';
	for (int i = 0; i < 5; i++){
		ps_Flexible->arr[i] = i + 1;
		printf("arr[%d]=%d\n",i,ps_Flexible->arr[i]);
			//arr[0] = 1
			//arr[1] = 2
			//arr[2] = 3
			//arr[3] = 4
			//arr[4] = 5
	}
	printf("total_size=%d\nch=%c\n", ps_Flexible->total_size, ps_Flexible->ch);//n=28 ch=c

	//现在觉得数组空间不够用了,使用realloc为数组再分配5个空间
	//为结构体指针再增加5个int大小空间
	ps_Flexible->total_size = ps_Flexible->total_size+sizeof(int)* 5;
	struct S* expand_arr = (struct s*)realloc(ps_Flexible, ps_Flexible->total_size);
	if (expand_arr == NULL){
		printf("%s", strerror(errno));
	}
	else{
		ps_Flexible = expand_arr;
		for (int i = 6; i <= 10; i++){
			ps_Flexible->arr[i - 1] = i;
		}
		for (int i = 0; i < 10; i++){
			printf("arr[%d]=%d\n",i, ps_Flexible->arr[i]);
				//arr[0] = 1
				//arr[1] = 2
				//arr[2] = 3
				//arr[3] = 4
				//arr[4] = 5
				//arr[5] = 6
				//arr[6] = 7
				//arr[7] = 8
				//arr[8] = 9
				//arr[9] = 10
		}
		printf("total_size = %d\n", ps_Flexible->total_size);//total_size = 48
	}
	free(ps_Flexible);
	ps_Flexible = NULL;
	return 0;
}


//柔性数组第二种方法,不推荐使用,因为两次malloc,容易产生内存碎片,分配的内存不连续,
//CPU从寄存器拿数据,寄存器从高速缓存拿数据,高速缓存从内存拿数据,
//如果数据在内存中不连续,会降低数据的处理速度
struct S{
	int n;
	int* arr;
};

int main(){
	struct S* ps = malloc(sizeof(struct S));
	printf("%d\n", sizeof(*ps));
	//为 ps->arr指针分配5个int大小的动态内存空间
	ps->arr = (int*)malloc(sizeof(int) * 5);
	if (ps->arr == NULL){
		printf("%s\n", strerror(errno));
	}
	else{
		for (int i = 0; i < 5; i++){
			*(ps->arr + i) = i + 1;
			printf("arr[%d]=%d\n", i, *(ps->arr + i));
		}
	}

	//为 ps->arr指针增加5个int大小的动态内存空间
	int* expand_arr = realloc(ps->arr, sizeof(int)* 10);
	if (expand_arr == NULL){
		printf("%s\n", strerror(errno));
	}
	else{
		ps->arr = expand_arr;
		for (int i = 5; i < 10; i++){
			*(ps->arr+i) = i + 1;
		}
		for (int i = 0; i < 10; i++){
			printf("arr[%d]=%d\n", i, *(ps->arr + i));
		}
	}

	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值