当前位置:首页 » 《随便一记》 » 正文

【C语言】还有柔性数组?

29 人参与  2024年03月08日 10:31  分类 : 《随便一记》  评论

点击全文阅读


前言

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~


目录

前言

柔性数组

柔性数组的特点

柔性数组的使用

不使用柔性数组


柔性数组

如下代码int a[0]就是柔性数组

struct st_type{int i;//柔性数组前面至少要有一个其他成员int a[0];//柔性数组成员//int a[];};

柔性数组的特点

结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。sizeof返回的这种结构⼤⼩不包括柔性数组的内存。包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

柔性数组的使用

使用柔性数组,只是用了一次malloc函数,有利于访问速度(相对而言),减少了内存碎片把结构体的内存以及其成员要的内存⼀次性分配好,并返回⼀个结构体指针,⼀次free就可以把所有的内存也给释放掉。
struct st{int a;int arr[];};int main(){//用结构体指针变量ps接收malloc函数分配空间的地址struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));//              malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)//判断if (ps == NULL){return 1;}//使用ps->a = 100;for (int i = 0; i < 10; i++){ps->arr[i] = i;}//若数组空间不够//用realloc函数重新分配struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));if (ptr != NULL){ps = ptr;//再次赋值给ps}else{perror("realloc");}//继续使用for (int i = 0; i < 15; i++){ps->arr[i] = i;}//打印for (int i = 0; i < 15; i++){printf("%d ",ps->arr[i]);}//释放free(ps);ps = NULL;return 0;}

对比 不使用柔性数组

不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间

#include <stdio.h>#include<stdlib.h>struct st{int a;int* arr;};int main(){//用结构体指针变量ps接收malloc函数分配空间的地址struct st* ps = (struct st*)malloc(sizeof(struct st));//判断if (ps == NULL){return 1;}//使用ps->a = 100;//再次使用malloc函数给数组arr开辟空间ps->arr = (int*)malloc(10 * sizeof(int));if (ps->arr == NULL){perror("malloc-2");return 1;}//使用for (int i = 0; i < 10; i++){ps->arr[i] = i;}//数组空间不够// 利用realloc函数扩大int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));if (ptr == NULL){perror("realloc");return 1;}else{ps->arr = ptr;}//初始化前15个元素for (int i = 0; i < 15; i++){ps->arr[i] = i;}//打印for (int i = 0; i < 15; i++){printf("%d ", ps->arr[i]);}//释放free(ps->arr);ps->arr = NULL;free(ps);ps = NULL;return 0;}


点击全文阅读


本文链接:http://zhangshiyu.com/post/75706.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1