深入了解一下C语言中的柔性数组

目录
  • 什么是柔性数组
  • 柔性数组的使用

什么是柔性数组

柔性数组是在C99中定义的

结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组

柔性数组的长度可以写成0,也可以不规定数组长度

下面两种写法都是正确的

struct S
{
int i;
int a[0];//柔性数组成员
}
struct S
{
int i;
int a[];//柔性数组成员
}
  • 结构体中的柔性数组成员前面至少有一个其他成员
  • sizeof返回的这种结构体的大小不包括柔性数组的大小
  • 包含柔性数组成员的结构体用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大
    小,以适应柔性数组的预期大小。

柔性数组的使用

typedef struct S
{
	int i;
	char c[];//c是柔性数组
}S;

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}
	free(p);
	p = NULL;
	return 0;
}

在malloc开辟空间时,开辟空间大小为sizeof(S) + 10 * sizeof(char),前面的sizeof(S)其实是表示结构体中int i的大小,后面则是给c开辟了10个字节大小的连续空间

如果觉得前面开辟空间小了,数组c不够长,还可以用realloc函数对内存大小进行调整

int main()
{
	S* p = (S*)malloc(sizeof(S) + 10 * sizeof(char));
	if (p == NULL)
	{
		perror("malloc");
		return 1;
	}
	p->i = 10;

	S* ptr = (S*)realloc(p, sizeof(S) + 20 * sizeof(char));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	p = ptr;
	for (int i = 0; i < 20; i++)
	{
		p->c[i] = 'a';
	}

	free(p);
	p = NULL;
	return 0;
}

其实我们也可以写出另一种形式的结构体,它的功能与柔性数组类似

typedef struct S2
{
    it i;
    char* c;
}S2;

对于这个结构体的使用如下:

int main()
{
	S2* p = (S2*)malloc(sizeof(S2));
	p->i = 10;
	p->c = (char*)malloc(10 * sizeof(char));
	for (int i = 0; i < 10; i++)
	{
		p->c[i] = 'a';
	}

	free(p->c);
	p->c = NULL;
	free(p);
	p = NULL;

	return 0;
}

为了使用这个结构体,需要先给结构体开辟一个空间S2* p = (S2*)malloc(sizeof(S2));然后再需要动态开辟一个块空间让c指向

这种写法需要开辟2次内存,同样在最后释放内存是,也需要free2次

所以就可以看出柔性数组的好处:

第 一个是方便内存释放

因为不论是我们在使用时或给别人写一个函数让别人使用时,如果在里面做了二次内存分配,可能别人使用时并不会知道结构体内部还有一个成员需要释放。所以就需要把内存一次性分配好,在最后释放一次内存就可以了

第二个是加快访问

如果二次内存分配,就会在内存中产生一些内存碎片,这样即浪费了空间也不利于访问

到此这篇关于深入了解一下C语言中的柔性数组的文章就介绍到这了,更多相关C语言柔性数组内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C语言柔性数组实例详解

    本文实例分析了C语言柔性数组的概念及用法,对于进一步学习C程序设计有一定的借鉴价值.分享给大家供大家参考.具体如下: 一般来说,结构中最后一个元素允许是未知大小的数组,这个数组就是柔性数组.但结构中的柔性数组前面必须至少一个其他成员,柔性数组成员允许结构中包含一个大小可变的数组,sizeof返回的这种结构大小不包括柔性数组的内存.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小以适应柔性数组的预期大小.柔性数组到底如何使用? 不完整类型 C和C++对于不完

  • C语言编程C++柔性数组结构示例讲解

    目录 绕指柔-柔性数组 柔性数组的特点: 第一个好处是:方便内存释放 第二个好处是:这样有利于访问速度 总结 绕指柔-柔性数组 也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的. C99 中,结构体中的最后一个元素允许是未知大小的数组,这就叫做柔性数组成员. 柔性数组的特点: 1.结构中的柔性数组成员前面必须至少一个其他成员. 2.sizeof 返回的这种结构大小不包括柔性数组的内存. 3.包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,

  • C语言柔性数组详解

    目录 前言 一.柔性数组是什么? 二.柔性数组的特点 三.柔性数组的优点 总结 前言 可能大家第一眼看到这个标题会有点懵,到底什么是柔性数组,我怎么从来没听说过?但柔性数组确实是存在的,也经常会出现在一些公司的面试题中,今天就跟着笔者来学习一下柔性数组吧. 提示:以下是本篇文章正文内容,下面案例可供参考 一.柔性数组是什么? C99中,结构体中的最后一个元素允许是未知大小的数组,这就叫作柔性数组,for example: struct st_type { int i; int a[0];//柔性

  • C语言中的柔性数组你真的了解吗

    目录 柔性数组概念: 特点: 与指针动态开辟的比较 指针动态开辟 柔性数组 指针动态开辟的缺点 总结 柔性数组概念: 柔性数组就是一种特殊的数组 它也是结构体最后一个成员 也就是说,它存在结构体最后一个成员的位置上 特点: 1.柔性数组在结构体的大小是未知的,在sizeof中不计算其大小 #include<stdio.h> struct S { int n ; int arr[0];//或者int arr[]; }; main() { printf("The size of the

  • 详解C语言之柔性数组

    目录 定义 特点 具体使用例 总结 定义 可调整大小的数组 以0大小数组或无大小数组定义在结构体的最后一个元素中 特点 1.结构体中的柔性数组前必须包含至少一个其他成员. 2.sizeof返回的这种结构体大小不包含柔性数组的内存. 3.包含柔性数组成员的结构用malloc()函数进行内存的动态分配,并且分配的大小应该大于结构的大小,以适应柔性数组的预期大小. 具体使用例  实现可调整大小的数组还可用一般的方法: 但是相比之下柔性数组有如下优点: 1.方便内存释放,如果分配两次内存,则需要释放两次

  • C语言 柔性数组的使用详解

    目录 一.柔性数组的特点 二.柔性数组的使用 1.如何使用柔性数组 2.不用柔性数组的话有什么代替 三.柔性数组的优势 1.方便内存释放 2.提高访问速度 一.柔性数组的特点 struct S { int x; int a[]; }; int main() { printf("%d", sizeof(S)); } 这段代码的输出是什么? 我们打印结构体S所占空间的大小,这个a[]占多少字节呢? 输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦. 原来,这是一种柔性数组

  • 深入了解一下C语言中的柔性数组

    目录 什么是柔性数组 柔性数组的使用 什么是柔性数组 柔性数组是在C99中定义的 结构体的最后一个元素允许是未知大小的数组,这就叫柔性数组 柔性数组的长度可以写成0,也可以不规定数组长度 下面两种写法都是正确的 struct S { int i; int a[0];//柔性数组成员 } struct S { int i; int a[];//柔性数组成员 } 结构体中的柔性数组成员前面至少有一个其他成员 sizeof返回的这种结构体的大小不包括柔性数组的大小 包含柔性数组成员的结构体用mallo

  • 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语言中指针和数组试题详解分析

    目录 数组题: 程序一(一维数组): 字符数组 程序二(字符数组): 程序三(字符数组): 程序四(字符数组): 程序五(字符数组): 二维数组 程序六( 二维数组): 指针题 程序七( 指针): 程序八( 指针): 程序九( 指针): 程序十( 指针): 程序十( 图): 程序十一( 指针): 程序十二( 指针): 程序十三( 指针): 指针 和 数组 试题解析 小编,在这里想说一下,c语言的最后一节 C预处理,可能还需要一些时间,因为小编,昨天才下载了虚拟机 和 linux 系统,还没开始安

  • 浅谈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 )); 释

  • 详解C语言中动态内存管理及柔性数组的使用

    目录 一.malloc 二.free 三.calloc 四.realloc 1.realloc在扩容时的情况 2.realloc也能实现malloc功能 五.使用动态内存的常见错误 1.free空指针 2.对动态开辟的空间越界访问 3.对非动态开辟内容free 4.只free动态开辟空间的一部分 5.对同一块内存多次free 6.动态内存空间忘记释放(内存泄漏) 六.柔性数组 1.柔性数组的概念 2.柔性数组的特点 3.柔性数组的使用场景 4.柔性数组的优点 一.malloc 这个函数向堆区申请

随机推荐