C语言中的柔性数组你真的了解吗
目录
- 柔性数组概念:
- 特点:
- 与指针动态开辟的比较
- 指针动态开辟
- 柔性数组
- 指针动态开辟的缺点
- 总结
柔性数组概念:
柔性数组就是一种特殊的数组
它也是结构体最后一个成员
也就是说,它存在结构体最后一个成员的位置上
特点:
1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小
#include<stdio.h> struct S { int n ; int arr[0];//或者int arr[]; }; main() { printf("The size of the structure is %d",sizeof(struct S)); return 0; }
2.在结构体中,如果存在柔性数组,就必须满足它的前面含有其它的成员,来申请空间,,因为他的大小本身是未知的,不计算大小。
3.包含柔性数组的结构体要靠malloc去动态申请这块空间,这就体现了柔性数组的柔,也就是可以控制大小,且分配的空间一定满足大于其它成员的大小。
与指针动态开辟的比较
在日常的编程中,有时候需要在结构体中存放一个长度动态的数组
一般的做法,是在结构体中定义一个指针成员,这个指针成员指向该数组所在的动态内存空间
指针动态开辟
#include<stdio.h> struct S { int n; int* arr; }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S)); ps->n = 100; ps->arr = (int*)malloc(40); free(ps->arr); ps->arr = NULL; free(ps); ps = NULL; return 0; }
通过柔性数组来实现如下:
柔性数组
#include<stdio.h> struct S { int n; int arr[0];//柔性数组 }; int main() { struct S* ps = (struct S*)malloc(sizeof(struct S)+40); //使用 //改变申请的空间 struct S* tmp= (struct S*)realloc(ps, sizeof(struct S)+80); if (tmp == NULL) { return; } if (tmp != NULL) { ps = tmp; } return 0; }
指针动态开辟的缺点
1.此方式会多次进行开辟于释放动态申请的空间,就容易会导致错误
2.容易出现内存碎片
当指针动态开辟的足够多的时候,中间就会出现很多内存碎片,每个内存碎片不连续
就会导致空间的浪费
3.相较于柔性数组,CPU访问的速度要慢一些
CPU访问内存大部分在访问一个空间后,就会访问相邻的空间,就不一次性访问下一个连续的空间,这就会导致,在一定程度上的降速。
总结
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!
相关推荐
-
详解C语言之柔性数组
目录 定义 特点 具体使用例 总结 定义 可调整大小的数组 以0大小数组或无大小数组定义在结构体的最后一个元素中 特点 1.结构体中的柔性数组前必须包含至少一个其他成员. 2.sizeof返回的这种结构体大小不包含柔性数组的内存. 3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的大小应该大于结构的大小,以适应柔性数组的预期大小. 具体使用例 实现可调整大小的数组还可用一般的方法: 但是相比之下柔性数组有如下优点: 1.方便内存释放,如果分配两次内存,则需要释放两次
-
C语言冷门知识之你可能没听过的柔性数组
目录 一.简述 二.具体使用 1.用创建柔性数组的方法: 2.用普通的写法 三.柔性数组的特点 一.简述 在c99中有明确的规定允许结构体中最后一个数组大小是未知的. 柔性数组其实是结构体中的最后一个数组未说明大小,且结构体中至少包含一个以上其他类型,如 #include<stdio.h> struct hei { int zeng; char shi; int arr[];//或者int arr[0]; }ma; int main() { struct hei ma; return 0 }
-
C语言柔性数组详解
目录 前言 一.柔性数组是什么? 二.柔性数组的特点 三.柔性数组的优点 总结 前言 可能大家第一眼看到这个标题会有点懵,到底什么是柔性数组,我怎么从来没听说过?但柔性数组确实是存在的,也经常会出现在一些公司的面试题中,今天就跟着笔者来学习一下柔性数组吧. 提示:以下是本篇文章正文内容,下面案例可供参考 一.柔性数组是什么? C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作柔性数组,for example: struct st_type { int i; int a[0];//柔性
-
C语言编程C++柔性数组结构示例讲解
目录 绕指柔-柔性数组 柔性数组的特点: 第一个好处是:方便内存释放 第二个好处是:这样有利于访问速度 总结 绕指柔-柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的. C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员. 柔性数组的特点: 1.结构中的柔性数组成员前面必须至少一个其他成员. 2.sizeof 返回的这种结构大小不包括柔性数组的内存. 3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,
-
C语言编程之动态内存与柔性数组的了解
目录 介绍动态内存分配函数 常见的动态内存开辟的错误 举个例子 柔性数组 柔性数组的特点 创建变量 1,局部变量–栈区 2,全局变量–静态区 创建数组 1,局部数组–栈区 2,全局数组–静态区 介绍动态内存分配函数 malloc free calloc realloc 所有的动态内存分配,都是在堆中进行分配 分别介绍动态内存函数 malloc void* malloc(size_t size) 向内存堆中申请size个字节,并返回该空间的首地址.同时定义一个指针来接受函数返回的地址. 如: in
-
C语言中的柔性数组你真的了解吗
目录 柔性数组概念: 特点: 与指针动态开辟的比较 指针动态开辟 柔性数组 指针动态开辟的缺点 总结 柔性数组概念: 柔性数组就是一种特殊的数组 它也是结构体最后一个成员 也就是说,它存在结构体最后一个成员的位置上 特点: 1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小 #include<stdio.h> struct S { int n ; int arr[0];//或者int arr[]; }; main() { printf("The size of the
-
深入了解一下C语言中的柔性数组
目录 什么是柔性数组 柔性数组的使用 什么是柔性数组 柔性数组是在C99中定义的 结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组 柔性数组的长度可以写成0,也可以不规定数组长度 下面两种写法都是正确的 struct S { int i; int a[0];//柔性数组成员 } struct S { int i; int a[];//柔性数组成员 } 结构体中的柔性数组成员前面至少有一个其他成员 sizeof返回的这种结构体的大小不包括柔性数组的大小 包含柔性数组成员的结构体用mallo
-
C语言中指针和数组试题详解分析
目录 数组题: 程序一(一维数组): 字符数组 程序二(字符数组): 程序三(字符数组): 程序四(字符数组): 程序五(字符数组): 二维数组 程序六( 二维数组): 指针题 程序七( 指针): 程序八( 指针): 程序九( 指针): 程序十( 指针): 程序十( 图): 程序十一( 指针): 程序十二( 指针): 程序十三( 指针): 指针 和 数组 试题解析 小编,在这里想说一下,c语言的最后一节 C预处理,可能还需要一些时间,因为小编,昨天才下载了虚拟机 和 linux 系统,还没开始安
-
C语言学习之柔性数组详解
目录 一.前言 二.柔性数组的用法 三.柔性数组的内存分布 四.柔性数组的优势 五.总结 一.前言 仔细观察下面的代码,有没有看出哪里不对劲? struct S { int i; double d; char c; int arr[]; }; 还有另外一种写法: struct S { int i; double d; char c; int arr[0]; }; 你应该一眼就看到了,结构体的最后一个成员数组的写法是int arr[];或者是int arr[0],这两种写法是等价的,意思是这个数组
-
详解C语言中的字符串数组
在C语言当中,字符串数组可以使用: char a[] [10]; 或者 char *a[]; 表示 第一种表示方式固定了每个字符串的最大大小.第二种没有字符串的大小限制. #include <stdio.h> #include <string.h> //该程序的功能是 输入阿拉伯数字的月份数 输出英文月份 int main() { //一个字符串数组 它的下标代表英文月份的阿拉伯数字 char *month[] = {"January","Februa
-
C语言中的递归,你真的懂了吗?
什么是递归? 要说到递归如果不说栈的话,我觉得有点不合适,递归特点就是不断的调用同一个函数,如果这个函数没有一个递归界限,那么就是死循环了,所以讨论递归,就必须要讨论递归的界限,就是限定这个递归调用多少次. 我们看一个例子 #include "stdio.h" int digui(unsigned long count ) { if(count > 0){ count --; printf("%d \n",count); digui(count); } ret
-
浅谈Go语言中字符串和数组
go语言里边的字符串处理和PHP还有java 的处理是不一样的,首先申明字符串和修改字符串 复制代码 代码如下: package main import "fmt" var name string //申明一个字符串 var emptyname string = "" //申明一个空字符串 func main() { //申明多个字符串并且赋值 a, b, v := "hello", "word", &
-
C语言中判断两数组中是否有相同的元素
思路: 首先创建两个数组,分别为a[ ]和b[ ]先拿a数组里的第一个元素和b数组的所有元素比较是否相同,再拿a数组里的第二个元素与b数组所有元素进行比较,以此类推.运用两次for循环来完成,用i循环生成a数组的各个下标,在循环体中用j循环生成b数组下标,j循环中判断a[ i ]是否等于b[ j ],如果条件成立即相同元素.flag用来标记程序运行到某一刻的状态,来加以判断if中的语句是否执行. system函数的作用是运行以字符串参数的形式传递给他的命令,并且等待该命令的完成,形式:#incl
-
C语言中多维数组的内存分配和释放(malloc与free)的方法
如果要给二维数组(m*n)分配空间,代码可以写成下面: 复制代码 代码如下: char **a, i; // 先分配m个指针单元,注意是指针单元 // 所以每个单元的大小是sizeof(char *) a = (char **) malloc(m * sizeof(char * )); // 再分配n个字符单元, // 上面的m个指针单元指向这n个字符单元首地址 for(i = 0; i < m; i++) a[i] = (char * )malloc(n * sizeof(char )); 释
随机推荐
- Java中BigDecimal的基本运算(详解)
- CloudStack 安装及使用过程中常见问题汇总
- asp.net DataGrid 中文字符排序的实现代码
- 优化PHP代码技巧的小结
- 利用Python的Django框架中的ORM建立查询API
- javascript解析json数据的3种方式
- Python的Flask框架中集成CKeditor富文本编辑器的教程
- 关于vue.js过渡css类名的理解(推荐)
- Javascript call和apply区别及使用方法
- JS控件的生命周期介绍
- Ruby设计模式编程中使用Builder建造者模式的实例
- SQL字段拆分优化
- JS+CSS实现DIV层的展开、收缩效果
- Python黑魔法Descriptor描述符的实例解析
- GreenDao 3.2.0 的基本使用
- android侧滑菜单控件DrawerLayout使用方法详解
- Python将多个excel表格合并为一个表格
- 基于redis分布式锁实现秒杀功能
- ios实现简单随便移动的AR功能
- 2018版java多线程面试题集合及答案