//柔性数组 (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;
}
C语言零长度数组(柔性数组)
于 2024-09-07 19:41:49 首次发布