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++中共用体的定义与应用总结

    C++中共用体的定义与应用总结

    共同体的定义类似结构体,不过共同体的所有成员都在同一段内存中存放,起始地址一样,并且同一时刻只能使用其中的一个成员变量
    2013-10-10
  • 使用C++17实现JSON库设计思路示例全解

    使用C++17实现JSON库设计思路示例全解

    这篇文章主要为大家介绍了使用C++17实现JSON库设计思路示例全解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-08-08
  • C++ Explicit关键字详细解析

    C++ Explicit关键字详细解析

    以下是对C++中Explicit关键字的用法进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
    2013-09-09
  • C++连接mysql数据库(改进版)

    C++连接mysql数据库(改进版)

    C++是大家都非常熟悉的,也是大家平时办公中经常会用到的,下面这篇文章主要给大家介绍了关于C++连接mysql数据库的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2023-12-12
  • 基于matlab实现DCT数字水印嵌入与提取

    基于matlab实现DCT数字水印嵌入与提取

    数字水印技术是将一些标识信息直接嵌入数字载体当中, 或间接表示在信号载体中, 且不影响原载体的使用价值。本文主要为大家介绍了基于matlab如何实现数字水印的嵌入与提取,感兴趣的可以学习一下
    2022-01-01
  • C语言编写五子棋游戏

    C语言编写五子棋游戏

    这篇文章主要为大家详细介绍了C语言编写五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • C语言指针和数组深入探究使用方法

    C语言指针和数组深入探究使用方法

    在C语言和C++等语言中,数组元素全为指针变量的数组称为指针数组,指针数组中的元素都必须具有相同的存储类型、指向相同数据类型的指针变量。指针数组比较适合用来指向若干个字符串,使字符串处理更加方便、灵活
    2022-08-08
  • 深入解析Linux下\r\n的问题

    深入解析Linux下\r\n的问题

    本篇文章是对Linux下\r\n的问题进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • C的|、||、&、&&、异或、~、!运算符

    C的|、||、&、&&、异或、~、!运算符

    这篇文章主要介绍了C的|、||、&、&&、异或、~、!运算符,需要的朋友可以参考下
    2014-06-06
  • C++分析讲解类的静态成员函数如何使用

    C++分析讲解类的静态成员函数如何使用

    与静态数据成员不同,静态成员函数的作用不是为了对象之间的沟通,而是为了能处理静态数据成员,静态成员函数没有this指针。既然它没有指向某一对象,也就无法对一个对象中的非静态成员进行默认访问
    2022-04-04

最新评论