【C语言】还有柔性数组?

这篇具有很好参考价值的文章主要介绍了【C语言】还有柔性数组?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

也许你从来没有听说过柔性数组(flexible array)这个概念,但是它确实是存在的。C99中,结构中的最后⼀个元素允许是未知⼤⼩的数组,这就叫做『柔性数组』成员。

【C语言】还有柔性数组?,柔性数组

欢迎关注个人主页:逸狼


创造不易,可以点点赞吗~

如有错误,欢迎指出~


目录

前言

柔性数组

柔性数组的特点

柔性数组的使用

不使用柔性数组


柔性数组

如下代码int a[0]就是柔性数组

struct st_type
{
	int i;//柔性数组前面至少要有一个其他成员
	int a[0];//柔性数组成员
	//int a[];
};

柔性数组的特点

  • 结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
  • sizeof返回的这种结构⼤⼩不包括柔性数组的内存。
  • 包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

【C语言】还有柔性数组?,柔性数组

柔性数组的使用

  1. 使用柔性数组,只是用了一次malloc函数,有利于访问速度(相对而言),减少了内存碎片
  2. 把结构体的内存以及其成员要的内存⼀次性分配好,并返回⼀个结构体指针,⼀次free就可以把所有的内存也给释放掉。
struct st
{
	int a;
	int arr[];
};

int main()
{//用结构体指针变量ps接收malloc函数分配空间的地址
	struct st*ps=(struct st*)malloc(sizeof(struct st) + 10 * sizeof(int));
	//              malloc分配空间的大小是 结构体大小+40字节 (40字节是分配给柔性数组的)
	//判断
	if (ps == NULL)
	{
		return 1;
	}
	//使用
	ps->a = 100;
	for (int i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	//若数组空间不够
	//用realloc函数重新分配
	struct st*ptr=(struct st*)realloc(ps,sizeof(struct st) + 15 * sizeof(int));
	if (ptr != NULL)
	{
		ps = ptr;//再次赋值给ps
	}
	else
	{
		perror("realloc");
	}
	//继续使用
	for (int i = 0; i < 15; i++)
	{
		ps->arr[i] = i;
	}
	//打印
	for (int i = 0; i < 15; i++)
	{
		printf("%d ",ps->arr[i]);
	}
	//释放
	free(ps);
	ps = NULL;
	return 0;
}

对比 不使用柔性数组

不使用柔性数组实现同样功能,就要多次使用malloc函数开辟空间文章来源地址https://www.toymoban.com/news/detail-838302.html

#include <stdio.h>
#include<stdlib.h>
struct st
{
	int a;
	int* arr;
};
int main()
{//用结构体指针变量ps接收malloc函数分配空间的地址
	struct st* ps = (struct st*)malloc(sizeof(struct st));
	//判断
	if (ps == NULL)
	{
		return 1;
	}
	//使用
	ps->a = 100;
	//再次使用malloc函数给数组arr开辟空间
	ps->arr = (int*)malloc(10 * sizeof(int));
	if (ps->arr == NULL)
	{
		perror("malloc-2");
		return 1;
	}
	//使用
	for (int i = 0; i < 10; i++)
	{
		ps->arr[i] = i;
	}
	//数组空间不够
	// 利用realloc函数扩大
	int* ptr = (int*)realloc(ps->arr, 15 * sizeof(int));
	if (ptr == NULL)
	{
		perror("realloc");
		return 1;
	}
	else
	{
		ps->arr = ptr;
	}
	//初始化前15个元素
	for (int i = 0; i < 15; i++)
	{
		ps->arr[i] = i;
	}
	
	//打印
	for (int i = 0; i < 15; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	//释放
	free(ps->arr);
	ps->arr = NULL;
	free(ps);
	ps = NULL;
	return 0;
}

到了这里,关于【C语言】还有柔性数组?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 椋鸟C语言笔记#31:结构体(联合体)嵌套、柔性数组

    萌新的学习笔记,写错了恳请斧正。 目录 结构体(联合体)嵌套 嵌套时内嵌结构体(联合体)不创建变量(匿名) 嵌套时内嵌结构体(联合体)创建变量(非匿名) 嵌套初始化 柔性数组 柔性数组的使用 结构体(联合体)嵌套 结构体、联合体可以嵌套,也就是说结构体(

    2024年02月02日
    浏览(44)
  • 【C语言】动态内存管理(malloc,free,calloc,realloc,柔性数组)

    本章重点 为什么存在动态内存管理 动态内存函数的介绍 malloc free calloc realloc 常见的动态内存错误 几个经典的笔试题 柔性数组 我们已经掌握的内存开辟方式有: int val = 20; //在栈空间上开辟四个字节 char arr[10] = {0}; 在栈空间上开辟十个字节的连续空间 但是上述开辟空间的方

    2024年02月03日
    浏览(48)
  • C语言——动态内存管理(malloc, calloc, realloc, free, 柔性数组详解)

    我们以往定义数组,都是这么定义的: 以这种方式开辟空间有两个特点: 空间开辟的大小是固定的 数组在声明的时候,必须指定数组的长度,它所需要的内存在编译时分配 因此就导致了这样一个现象:我们无法在后续的过程中修改数组的大小,这是一个十分麻烦的事情 而

    2024年02月16日
    浏览(54)
  • 动态内存管理、柔性数组

    我们已经掌握的内存开辟的方式: 上面开辟的空间大小是固定不可变的 数组申请的大小也是确定了之后就不能改变 这里就引入了动态内存的开辟,可以根据内存的需要进行更改  malloc和free malloc的功能是申请size个连续可用 size_t类型的字节 空间,并返回指向这块空间的void

    2024年02月22日
    浏览(50)
  • 动态内存管理之柔性数组

    柔性数组: 只存在于结构体中,而且还要是结构体的最后一个成员,并且在他的前面必须要有其他成员, 大小是未知的,所以在用sizeof计算出的结构体大小是出柔性数组外的, 柔性数组的大小是可以变化的,那么如何调整柔性数组的大小呢, 想到调整大小我们就可以想到动

    2024年02月15日
    浏览(69)
  • 柔性数组知识点

    什么是柔性数组?柔性数组其实也是动态内存管理部分的内容。这节主要来复习柔性数组的知识点。  当结构体的最后一个成员为数组, 且这个数组的大小未确定时, 我们就称它是柔性数组。 如: struct stu {         char name[20];         int age;         char adress[]; } 这里的

    2024年02月22日
    浏览(52)
  • 使用柔性数组重写MyString

    hello,各位宝子,今天阿崽将使用c++和柔性数组的方式重新去写String类 在开始本次知识前,首先给大家介绍下柔性数组这个buff特点: 结构中的柔性数组成员前面至少要包含一个其他成员 sizeof返回的这种结构大小不包括柔性数组的内存 包含柔性数组成员的结构用malloc函数进行

    2024年02月09日
    浏览(38)
  • 超详细——动态内存分配+柔性数组

    ☃️个人主页:fighting小泽 🌸作者简介:目前正在学习C语言和数据结构 🌼博客专栏:C语言学习 🏵️欢迎关注:评论👊🏻点赞👍🏻留言💪🏻 我们已经学会的内存开辟方式有:创建一个变量,创建一个数组 我们创建一个整形变量就会申请4个字节,创建个数组就会申请

    2023年04月15日
    浏览(49)
  • Redis(一)原理及基本命令(柔性数组)

    Redis(一)原理及基本命令(柔性数组) Redis(二)网络协议和异步方式(乐观锁悲观锁) Redis(三)存储原理与数据模型(hash冲突、渐进式rehash) Redis跳表 Redis 是 Remote Dictionary Service 的简称,被称为远程字典服务;redis客户端和服务端是基于TCP建立网络通信的。 Redis 是内存

    2024年02月16日
    浏览(43)
  • 【C进阶】分析 C/C++程序的内存开辟与柔性数组(内有干货)

            本文是对于动态内存管理知识后续的补充,以及加深对其的理解。对于动态内存管理涉及的大部分知识在这篇文章中 ---- 【C进阶】 动态内存管理_Dream_Chaser~的博客-CSDN博客         本文涉及的知识内容主要在两方面: 简单解析C/C++程序的内存开辟 分析柔性数组

    2024年02月09日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包