c语言-柔性数组

文章目录

  • 前言
  • 一、柔性数组的介绍
    • 1.1 柔性数组的定义
  • 二、柔性数组的使用
    • 2.1 使用说明
    • 2.2 结构体中的成员只包含一个柔性数组成员
    • 2.3 结构体中的成员包含其他成员和一个柔性数组成员
  • 三、模拟柔性数组
  • 总结


前言

本篇文章介绍c语言中的柔性数组。


一、柔性数组的介绍

1.1 柔性数组的定义

在定义一个结构体类型时,结构体的最后一个成员变量允许为一个没有大小的数组时,这个数组称为柔性数组。
注意点:柔性数组成员必须是结构体成员的最后一个成员
例如,下面定义一个拥有柔性数组的结构体类型
方式一:

struct S
{int n;int arr[0];  //数组大小未知,柔性数组
};

方式二:

struct S
{int n;int arr[];  //数组大小未知,柔性数组
};

二、柔性数组的使用

2.1 使用说明

  • sizeof返回的包含柔性数组的结构体的大小时,返回值不包括柔性数组的大小。
  • 包含柔性数组的结构体使用malloc()函数进行动态内存的分配,并且分配的内存大小应该大于结构体的大小,以适应柔性数组的预期大小。
  • 可以使用realloc()函数修改柔性数组的大小。

2.2 结构体中的成员只包含一个柔性数组成员

结构体定义:

//结构体成员只存在柔性数组成员
struct Single_S
{int arr[0];
};

使用malloc()为柔性数组分配空间

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<errno.h>
int main()
{struct Single_S* ps = (struct Single_S*)malloc(20);if (NULL == ps){printf("%s\n", strerror(errno));return 1;}//使用int i = 0;for (i = 0; i < 5; i++){ps->arr[i] = i;}//动态修改struct Single_S* ptr = (struct Single_S*)realloc(ps,40);if (ptr != NULL){ps = ptr;ptr = NULL;//使用从ps->arr[5]开始,因为0~4已经初始化for (i = 5; i < 10; i++){ps->arr[i] = i;}}//释放free(ps);ps = NULL;return 0;
}

通过vs的内存监视查看内存情况
在这里插入图片描述

2.3 结构体中的成员包含其他成员和一个柔性数组成员

结构体定义

struct S
{int n;int arr[];  //数组大小为0,柔性数组
};

使用malloc()为柔性数组分配空间

int main()
{//申请sizeof(struct S)+20struct S* ps = (struct S*)malloc(sizeof(struct S)+20);if (NULL == ps){printf("%s\n", strerror(errno));return 1;}//使用ps->n = 5;int i = 0;for (i = 0; i < 5; i++){ps->arr[i] = i;  //赋值}//扩容sizeof(struct)+40struct S* ptr = (struct S*)realloc(ps,sizeof(struct S)+40);if (ptr != NULL){ps = ptr;ptr = NULL;//使用ps->n = 10;for (i = 5; i < 10; i++){ps->arr[i] = i;  //赋值}}//释放free(ps);ps = NULL;return 0;
}

通过vs的内存监视查看内存情况
在这里插入图片描述

三、模拟柔性数组

结构体定义

struct SS
{int n;int* arr;  //int*指针
};

为了模拟柔性数组,在创建结构体变量时,采用malloc()为结构体分配内存。

int main()
{//创建结构体struct SS* ps = (struct SS*)malloc(sizeof(struct SS));if (NULL == ps){printf("%s\n", strerror(errno));return 1;}//创建一块5个int大小的空间ps->arr = (int*)malloc(5*sizeof(int));if (ps->arr != NULL){ps->n = 5;int i = 0;for (i = 0; i < 5; i++){ps->arr[i] = i;  //赋值}}//扩容int* ptr = (int*)realloc(ps->arr, 10*sizeof(int));if (ptr != NULL){ps->arr = ptr;ptr = NULL;ps->n = 10;int  j = 0;for (j = 5; j < 10; j++){ps->arr[j] = j; //赋值}}//释放ps->arrfree(ps->arr);ps->arr = NULL;//释放psfree(ps);ps = NULL;return 0;
}

通过vs的内存监视查看内存情况
在这里插入图片描述
使用这种方式,需要进行两次释放操作,首先释放数组的空间,然后释放结构体的空间。


总结

本篇文章介绍了柔性数组的定义和使用,最后模拟实现柔性数组。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/434269.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JavaSec基础命令执行

记录https://github.com/javaweb-sec/javaweb-sec的学习 CommandExecute Runtime#exec ProcessBuilder#start 以上两个最终都要调到ProcessImpl 而ProcessImpl会调用native的forkAndExec 实际最终都是调到Java_java_lang_ProcessImpl_forkAndExec 而我们只需要直接调用最…

单调栈第二天(还没写完)

503.下一个更大元素II 力扣题目链接(opens new window) 给定一个循环数组&#xff08;最后一个元素的下一个元素是数组的第一个元素&#xff09;&#xff0c;输出每个元素的下一个更大元素。数字 x 的下一个更大的元素是按数组遍历顺序&#xff0c;这个数字之后的第一个比它更…

一、对人工智能大模型了解与认知

黑8说 月黑风高&#xff0c;乌云密布&#xff0c;树木低垂&#xff0c;黯淡沉闷。这黎明前的风暴&#xff0c;预示着新时代的变革即将到来。 在一个8线小城市的办公室中 黑8对主任说&#xff1a; 世界上有男人、女人、人妖&#xff0c;米国有1/3男&#xff0c;2/3女…&#xff…

Scratch:启蒙少儿编程的图形化魔法

在当今这个数字化时代&#xff0c;编程已经成为了一项重要的基础技能。就像学习阅读和写作一样&#xff0c;掌握编程能够打开通往未来世界的大门。对于孩子们来说&#xff0c;Scratch作为一种图形化编程语言&#xff0c;不仅简单有趣&#xff0c;而且非常适合作为编程学习的入门…

VS生成报错:MSB8036 The Windows SDK version 8.1 was not found.找不到 Windows SDK 版本 8.1

目录 一、查看本机SDK二、 解决法一&#xff1a;适配本电脑的SDK法二&#xff1a;下载SDK 8.1 VS生成报错&#xff1a;MSB8036 找不到 Windows SDK 版本 8.1。请安装所需版本的 Windows SDK&#xff0c;或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更…

解决 [Vue warn]:Avoid mutating a prop directly 警告

错误信息 [Vue warn]: Avoid mutating a prop directly since the value will be overwritten whenever the parent component re-renders. Instead, use a data or computed property based on the prop’s value. Prop being mutated: “xxx” 错误原因 所有的 prop 都使得…

感谢有你,1Panel开源面板项目致敬社区开发者

2024年1月24日&#xff0c;1Panel开源面板项目GitHub Star数成功突破15,000大关。 1Panel开源项目&#xff08;https://github.com/1Panel-dev&#xff09;于2023年3月20日正式发布。作为一款现代化、开源的Linux服务器运维管理面板&#xff0c;1Panel旨在通过开源的方式&…

臻于至善,CodeArts Snap 二维绘图来一套不?

前言 我在体验 华为云的 CodeArts Snap 时&#xff0c;第一个例子就是绘制三角函数图像&#xff0c;功能注释写的也很简单。 业务场景中&#xff0c;有一类就是需要产出各种二维图形的&#xff0c;比如&#xff0c;折线图、散点图、柱状图等。 为了提前积累业务素材&#xf…

iOS推送通知

文章目录 一、推送通知的介绍1. 简介2. 通知的分类 二、本地通知1. 本地通知的介绍2. 实现本地通知3. 监听本地通知的点击 三、远程通知1. 什么是远程通知2. 为什么需要远程通知3. 远程通知的原理4. 如何做远程通知5. 远程通知证书配置6. 获取远程推送要用的 DeviceToken7. 测试…

【JavaEE进阶】 数据库连接池与MySQL企业开发规范

文章目录 🌴数据库连接池🎋数据库连接池的使用🎄MySQL企业开发规范⭕总结🌴数据库连接池 数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个. 没有使⽤数据库连接池的情况:每次执⾏SQL语句,要先创建⼀…

OpenHarmony—类型转换仅支持as T语法

规则&#xff1a;arkts-as-casts 级别&#xff1a;错误 在ArkTS中&#xff0c;as关键字是类型转换的唯一语法&#xff0c;错误的类型转换会导致编译时错误或者运行时抛出ClassCastException异常。ArkTS不支持使用语法进行类型转换。 当需要将primitive类型&#xff08;如num…

DS:单链表的实现(超详细!!)

创作不易&#xff0c;友友们点个三连吧&#xff01; 在博主的上一篇文章中&#xff0c;很详细地介绍了顺序表实现的过程以及如何去书写代码&#xff0c;如果没看过的友友们建议先去看看哦&#xff01; DS&#xff1a;顺序表的实现&#xff08;超详细&#xff01;&#xff01;&…