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

 更新时间:2022年02月16日 15:45:04   作者:诚挚的乔治  
这篇文章主要为大家详细介绍了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语言的Cairo图形库绘制太极图实例教程

    利用C语言的Cairo图形库绘制太极图实例教程

    这几天都在研究Cairo图形库,这是一个开源跨平台的图形库,相对于OpenGL来说更容易上手使用。这篇文章是利用C语言的Cairo图形库绘制了一个太极图,对大家学习Cairo图形库具有一定的参考借鉴价值,下面来一起看看吧。
    2016-12-12
  • C语言三子棋小游戏的实现代码

    C语言三子棋小游戏的实现代码

    这篇文章主要为大家详细介绍了C语言三子棋小游戏的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-11-11
  • C++程序的五大内存分区实例详解

    C++程序的五大内存分区实例详解

    C++内存区域,一般可分为栈内存区、堆内存区、全局/静态内存区、文字常量内存区及程序代码区5大分区,本文就带大家深刻的理解这5大内存分区,感兴趣的可以了解一下
    2021-10-10
  • 八皇后问题的相关C++代码解答示例

    八皇后问题的相关C++代码解答示例

    这篇文章主要介绍了八皇后问题的相关C++代码解答示例,文中包括ACM竞赛的八皇后相关知识的练习实例,需要的朋友可以参考下
    2015-08-08
  • C++实践IP地址类项目参考

    C++实践IP地址类项目参考

    今天小编就为大家分享一篇关于C++实践IP地址类项目参考,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-02-02
  • C++实现LeetCode(137.单独的数字之二)

    C++实现LeetCode(137.单独的数字之二)

    这篇文章主要介绍了C++实现LeetCode(137.单独的数字之二),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • VSCode下.json文件的编写之(1) linux/g++ (2).json中参数与预定义变量的意义解释

    VSCode下.json文件的编写之(1) linux/g++ (2).json中参数与预定义变量的意义解释

    这篇文章主要介绍了VSCode下.json文件的编写之(1) linux/g++ (2).json中参数与预定义变量的意义解释,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C语言双指针多方法旋转数组解题LeetCode

    C语言双指针多方法旋转数组解题LeetCode

    这篇文章主要为大家介绍了C语言双指针使用多方法旋转数组题解LeetCode,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C++中String的语法及常用接口的底层实现详解

    C++中String的语法及常用接口的底层实现详解

    在C语言中,string是一个标准库类(class),用于处理字符串,它提供了一种更高级、更便捷的字符串操作方式,string 类提供了一系列成员函数和重载运算符,以便于对字符串进行操作和处理,本编文章会对C++中的 string 进行详解,希望本篇文章会对你有所帮助
    2023-06-06
  • c++中的基本IO类型详解

    c++中的基本IO类型详解

    IO的设备可以是文件、控制台、string。c++主要定义了三种IO类型,分别被包含在iostream、fstream、sstream头文件中,本文给大家分享c++中的基本IO类型,感兴趣的朋友跟随小编一起看看吧
    2021-07-07

最新评论