温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

C语言如何使用柔性数组

发布时间:2022-03-30 12:25:23 来源:亿速云 阅读:193 作者:小新 栏目:开发技术

这篇文章主要介绍了C语言如何使用柔性数组,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

一.柔性数组的特点

struct S
{
	int x;
	int a[];
};
int main()
{
	printf("%d", sizeof(S));
}

这段代码的输出是什么?

我们打印结构体S所占空间的大小,这个a[]占多少字节呢?

输出结果是4,可一个int类型的x就是4了,a[]去哪了?好奇怪哦。

原来,这是一种柔性数组。

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

2.结构中的柔性数组前面必须有至少一个其他成员。

3.sizeof返回的这种结构大小不包括柔性数组的内存。

4.包含柔数组成员的结构用malloc函数进行内存的动态分配,且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

二.柔性数组的使用

1.如何使用柔性数组

包含柔数组成员的结构用malloc函数进行内存的动态分配,

且分配的内存应该大于结构的大小,以适应柔性数组的预期大小。

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
 
struct S
{
	int x;
	int a[];
};
int main()
{
    //为柔性数组a[]开辟了40个字节的空间
	struct S *ps =(struct S*)malloc(sizeof(struct S) + 40);
	if (ps == NULL)                                    //检查是否为空指针
	{
		perror("ps");
		return 1;
	}
	ps->x = 10;												
	int i = 0;					
	for (i = 0; i < 10; i++)								
	{                                                  
		ps->a[i] = i;                                   //数组使用
	}
	for (i = 0; i < 10; i++)
	{
		printf("%d  ",ps->a[i]);                        //数组打印
	}
	//若觉得40不够用,可用realloc扩容
	//如:
	struct S* ptr = (struct S*)realloc(ps, sizeof(struct S) + 80);
	if (ptr == NULL)                                    //检查是否为空指针
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps = ptr;
	}
 
	free(ps);                                            //释放内存并置为空指针
	ps = NULL;
}

2.不用柔性数组的话有什么代替

我们经常用字符串指针来申请空间,

那我们直接给字符串指针malloc一块空间,不就行了吗,

为什么还要用柔性数组呢?

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
 
struct S
{
	int x;
	int *a;
};
int main()
{
	struct S* ps = (struct S*)malloc(sizeof(struct S) );//为结构体变量x开辟空间
	if (ps == NULL)
	{
		return 1;
	}
	ps->a = (int*)malloc(40);							//为字符串指针开辟40个字节的空间
	if (ps->a == NULL)
	{
		free(ps);
		ps = NULL;
		return 1;
	}
	free(ps->a);
	ps->a = NULL;
 
	free(ps);
	ps = NULL;
}

上述代码确实可以完成相同的功能,

但是柔性数组相对而言更好。

让我们来看看柔性数组的优势。

三.柔性数组的优势

1.方便内存释放

  • 使用柔性数组我们只用free一次,

  • 而使用字符串指针要free两次,有内存泄漏的风险

2.提高访问速度

  • 柔性数组malloc了一次,是连续的内存,

  • 有益于提高访问速度,减少内存碎片。

感谢你能够认真阅读完这篇文章,希望小编分享的“C语言如何使用柔性数组”这篇文章对大家有帮助,同时也希望大家多多支持亿速云,关注亿速云行业资讯频道,更多相关知识等着你来学习!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI