柔性数组----动态内存开辟

Hello,大家好,今天分享的是C语言不怎么用的到的柔性数组,虽然说柔性数组我们不怎么用的到,但是它有一些优点,比如和我们动态内存开辟几个函数一起用,它的利用空间的效率特别高,那今天我们就讲一些关于它的内容吧。

柔性数组

1.柔性数组前面必须得有元素
2柔性数组sizeof计算不算上柔性数组的大小
3我们使用的时候malloc要预先给它开辟好空间

那让我们先来看一个柔性数组,看看它的样子吧

c 复制代码
#include<stdio.h>
int main()
{
	struct S
	{
		int i;
		char c;
		int arr[];
	};
	return 0;
}

我们当然也可以写成下面的这个样子

c 复制代码
#include<stdio.h>
int main()
{
	struct S
	{
		int i;
		char c;
		int arr[0];
	};
	return 0;
}

但是在有些编译器下的平台并不能实现,我们只要去掉它的大小就可以了,我们再来计算它的大小看看

c 复制代码
#include<stdio.h>

int main()
{
	struct S
	{
		int i;
		char c;
		int arr[];
	};
	printf("%zd", sizeof(struct S));
	return 0;
}

通过我们的编译我们可以看到的结果是8个字节大小,说明它是不包括柔性数组的大小,所以我们计算的时候只要八个字节的大小。

那讲了柔性数组我们来看一下它的用法,我们说过它是和我们动态内存开辟可以一起用的,所以现在我们要为这个结构体开辟空间,开辟的时候我们也要为柔性数组的大小预先开辟新的空间,这个是什么意思呢,就是我们结构体的大小比如就是八个字节,那我们就必须开辟比八个字节大,而且是在这个上面加上4的整数倍的字节,当然如果是其他类型比如char,那就是随便开辟,我们这里先假设开辟的就是整型数组。

c 复制代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
	struct S
	{
		int i;
		char c;
		int arr[];
	};
	//printf("%zd", sizeof(struct S));
	struct S* ptr = (struct S*)malloc(sizeof(struct S) + 20);
	if (ptr == NULL)
	{
		perror("malloc fail\n");
		exit(-1);
	}
	ptr->i = 4;
	ptr->c = 'w';
	//用柔性数组
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ptr->arr[i] = i;
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d ",ptr->arr[i]);
	}

	return 0;
}

我们这里就是对它进行简单的使用,这里我们之前说它的效率高,这是为什么呢,原因就是我们开辟的空间是连续的,我们其实位置是结构体,但是我们如果不是结构体的话,我们使用空间就是碎片化的,因为我们的操作系统会分配一个空间给我们使用,我们如果用柔性数组的话,使用的时候不会有空间浪费,不过这里其实效率也没提高多少。

上面我们的动态内存使用好我们就要归还给操作系统,所以接下来就是free

c 复制代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
	struct S
	{
		int i;
		char c;
		int arr[];
	};
	//printf("%zd", sizeof(struct S));
	struct S* ptr = (struct S*)malloc(sizeof(struct S) + 20);
	if (ptr == NULL)
	{
		perror("malloc fail\n");
		exit(-1);
	}
	ptr->i = 4;
	ptr->c = 'w';
	//用柔性数组
	int i = 0;
	for (i = 0; i < 5; i++)
	{
		ptr->arr[i] = i;
	}
	for (i = 0; i < 5; i++)
	{
		printf("%d ",ptr->arr[i]);
	}
	free(ptr);
	ptr = NULL;

	return 0;
}

讲到这里其实我们也可以用动态函数模拟一个,就是再去malloc一个来存放数组,但是这是单独的,所以就有了我们的空间使用效率问题。

C语言的分享就到这里了,我们C++ Linux见

相关推荐
Pacify_The_North2 分钟前
【进程控制二】进程替换和bash解释器
linux·c语言·开发语言·算法·ubuntu·centos·bash
轮到我狗叫了23 分钟前
力扣310.最小高度树(拓扑排序,无向图),力扣.加油站力扣.矩阵置零力扣.二叉树中的最大路径和
算法·leetcode·职场和发展
埃菲尔铁塔_CV算法26 分钟前
深度学习驱动下的目标检测技术:原理、算法与应用创新(二)
深度学习·算法·目标检测
wuqingshun31415929 分钟前
经典算法 (A/B) mod C
c语言·开发语言·c++·算法·蓝桥杯
白杆杆红伞伞32 分钟前
04_决策树
算法·决策树·机器学习
爱coding的橙子36 分钟前
算法刷题Day9 5.18:leetcode定长滑动窗口3道题,结束定长滑动窗口,用时1h
算法·leetcode·职场和发展
姬公子52140 分钟前
leetcodehot100刷题——排序算法总结
数据结构·c++·算法·排序算法
AndrewHZ1 小时前
【图像处理基石】OpenCV中都有哪些图像增强的工具?
图像处理·opencv·算法·计算机视觉·滤波·图像增强·颜色科学
KangkangLoveNLP1 小时前
Llama:开源的急先锋
人工智能·深度学习·神经网络·算法·机器学习·自然语言处理·llama
z人间防沉迷k2 小时前
贪心、分治和回溯算法
算法