内存管理--柔性数组

本次讲的是,柔性数组,如果哪位小博客想要了解的更多,可以登录下面这个网站,了解详细内容

C语言结构体里的成员数组和指针 | 酷 壳 - CoolShellhttps://coolshell.cn/articles/11377.html

  • 我们就听说过数组,听说过柔性数组吗?柔性数组建立在结构体中,最后一个成员(是数组)并且没有指定大小。这就叫:柔性数组。它的标准代码为:

    cs 复制代码
    //柔性数组
    
    struct S
    {
    	char c;
    	int a;
    	int arr[];//柔性数组没有指定大小
    };

    这个就是柔性数组的基本表达。

  • 柔性数组的特点:1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。

2.sizeof返回的这种结构⼤⼩不包括柔性数组的内存。

3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配 的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

它的代码为:

cs 复制代码
//柔性数组的特点
struct S
{
	int a;
	int arr[];
};
int main()
{
	printf("%zd\n", sizeof(struct S));
	return 0;
}

打印的数字是4,这就说明,柔性数组不包含它自己本身的大小,而是它前一个数的大小。

  • 柔性数组的使用 :我们先直接上代码,然后在分析,则代码为:

    cs 复制代码
    //柔性数组的使用
    struct S
    {
    	int a;
    	int arr[];
    };
    int main()
    
    {
    	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
    	if (ps == NULL)
    	{
    		perror("malloc");
    		return 1;
    	}
    	ps->a = 100;
    	int i = 0;
    	for (i = 0; i < 5; i++)
    	{
    		ps->arr[i] = i;
    	}
    	//调整空间
    	struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 10 * sizeof(int));
    	if (ptr != NULL)
    	{
    		ps = ptr;
    	}
    
    	//释放
    	free(ps);
    	ps = NULL;
    	return 0;
    }

    对于这第一种代码,就是把内存放在堆上,还有第二种代码,我们来比较一下,看看哪种代码更容易被接受,则代码二为:

    cs 复制代码
    #include <stdio.h>
    #include <stdlib.h>
    typedef struct st_type
    {
    	int i;
    	int* p_a;
    }type_a;
    int main()
    {
    	type_a* p = (type_a*)malloc(sizeof(type_a));
    	p->i = 100;
    	p->p_a = (int*)malloc(p->i * sizeof(int));
    
    	//业务处理 
    	for (i = 0; i < 100; i++)
    	{
    		p->p_a[i] = i;
    	}
    
    	//释放空间 
    	free(p->p_a);
    	p->p_a = NULL;
    	free(p);
    	p = NULL;
    	return 0;
    }

    你们说这两种代码,哪一个更好?

其实,两种代码,都有各自的好处,各有各的特点,首先第一个,它释放内存快,方便释放内存

第二个,方便访问内存的速度,各有各的千秋吧,

我们不去讨论哪一个更好,而是要看,它们各自的优点。你们认为呢?

相关推荐
影视飓风TIM42 分钟前
C++ STL 完整入门笔记[9]:C++ 仿函数、priority_queue与STL算法底层笔记
数据结构·c++·笔记
依然鸣1 小时前
蓝桥杯多校模拟赛(第二场)题解
数据结构·c++·经验分享·学习·算法·图论
依然鸣1 小时前
蓝桥杯多校模拟赛 题解
数据结构·c++·经验分享·学习·算法·蓝桥杯
AKA__Zas1 小时前
芝士算法(位运算)
java·开发语言·算法·leetcode·学习方法
wabs6662 小时前
关于图论【Kruskal算法|卡码网53.寻宝的思考】
数据结构·算法·图论·卡码网
hans汉斯2 小时前
人工智能与机器人研究|面向无标签数据的三维场景语义理解方法研究
人工智能·神经网络·算法·信息可视化·cnn·机器人
小程故事多_8012 小时前
从A2C、TRPO、PPO到GRPO,强化学习策略梯度算法完整演进与大模型落地实战解析
人工智能·算法
2601_9561219714 小时前
二分算法(知识点+题目)
c++·算法
AndrewHZ16 小时前
【LLM技术全景】阶段总结:技术原理篇核心知识回顾
人工智能·深度学习·算法·语言模型·大模型·llm·芯片开发
小星星闪亮登场17 小时前
2026萌新联赛第三场-- (郑州轻工业大学)
数据结构·c++·经验分享·算法·贪心算法·排序算法·深度优先