C语言柔性数组详解

news2024/9/22 19:36:29

柔性数组

C99中,结构体中最后一个元素允许是未知大小的数组,这叫做 【柔性数组】成员。

例1:

struct node {
	int i;
	int num[]; // 柔性数组成员
};

例2:

struct node {
	int i;
	int num[0]; // 柔性数组成员
};

柔性数组的特点:

  • 结构中的柔性数组成员面前至少有一个其他成员。
  • sizeof 返回的结构体大小不包含柔性数组成员大小。
  • 包含柔性数组成员的结构用 malloc 函数进行内存的动态分配,并且分配的内存应该大于结构体的大小,以适应柔性数组初始大小。
#include <stdlib.h>
#include <stdio.h>

typedef struct node {
	int length;
	int nums[]; // 柔性数组成员
}node;


int main() {

	/*
		sizeof(node) 的结果是4,这4个字节给到i元素
		sizeof(int) * 10 的字节给到了柔性数组成员
	*/
	node* ps = (node*)malloc(sizeof(node) + sizeof(int) * 10);
	if (ps == NULL) {
		perror("malloc:");
		exit(-1);
	}
	ps->length = 10;
	int i = 0;
	for (i = 0; i < ps->length; i++) {
		ps->nums[i] = i;
	}

	// 扩容
	node* new_ps = (node*)realloc(ps , sizeof(node) + sizeof(int) * 20);
	if (new_ps == NULL) {
		perror("realloc:");
		exit(-1);
	}
	ps = new_ps;
	ps->length = 20;
	for (i = 10; i < ps->length; i++) {
		ps->nums[i] = i;
	}
	for (i = 0; i < ps->length; i++) {
		printf("%d ", ps->nums[i]);
	}

	free(ps);
	ps = NULL;

	return 0;
}

在这里插入图片描述

柔性数组的好处:

  • 方便内存释放。
  • 利于访问速度(连续的内存有益于提高访问速度,也有益于减少内存碎片)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CMake 笔记

CMake 笔记 CMake 笔记 基础项目多个目录创建项目 链接库 用到的指令实验 使用自定义库 用到的指令实验 指定 C 标准CMake常见变量名 基础项目 实现一个CMakeLists.txt最简单是以下三步&#xff1a; # 最低 CMake 版本要求&#xff1a;指定项目所需的最低 CMake 版本 cma…

<网络编程>网络基础

目录 计算机网络背景 认识“协议”&#xff1a; TCP/IP五层模型 网络传输基本流程 不在一个局域网进行通信 了解网络发展背景&#xff0c;对局域网/广域网的概念认识 了解网络协议意义&#xff0c;重点理解TCP/IP五层结构 学习网络传输的基本流程&#xff0c;理解封装和…

gRPC远程调用协议

gRPC 简介 gRPC是一个现代的、高性能、开源的和语言无关的通用 RPC 框架&#xff0c;基于 HTTP2 协议设计&#xff0c;序列化使用PB(Protocol Buffer)&#xff0c;PB 是一种语言无关的高性能序列化框架&#xff0c;基于 HTTP2PB 保证了的高性能。 HTTP2.0 grpc采用HTTP2.0&…

NFT Insider #100:The Sandbox 展示泰国 2023 年元宇宙生态系统,​游戏巨头世嘉暂缓链游项目开发

引言&#xff1a;NFT Insider由NFT收藏组织WHALE Members、BeepCrypto联合出品&#xff0c;浓缩每周NFT新闻&#xff0c;为大家带来关于NFT最全面、最新鲜、最有价值的讯息。每期周报将从NFT市场数据&#xff0c;艺术新闻类&#xff0c;游戏新闻类&#xff0c;虚拟世界类&#…

第三章 数据链路层【计算机网络】

第三章 数据链路层【计算机网络】 前言推荐第三章 数据链路层3.1 数据链路层的几个共同问题3.1.1 数据链路和帧3.1.2 三个基本问题 3.2点对点协议PPP3.2.1 PPP协议的特点3.2.2 PPP协议的帧格式3.2.3 PPP协议的工作状态 3.3 使用广播信道的数据链路层3.3.1 局域网的数据链路层3.…

ADManager Plus:企业自动化管理的利器

在当今数字化时代&#xff0c;企业管理面临着越来越多的挑战。为了提高效率、降低成本并确保信息安全&#xff0c;自动化管理成为了企业的首要选择。而在众多自动化管理工具中&#xff0c;ADManager Plus无疑是一款卓越的解决方案。本文将为您介绍ADManager Plus的功能与优势&a…

【Accumulate】Gitee解决每次推送输入账户密码问题

【前言】 每次建立私人仓库后&#xff0c;一推送就得输入账户密码&#xff0c;真的巨烦人啊。 【解决】 step1&#xff1a; 绑定私匙&#xff1a; 配置Git_犟小孩的博客-CSDN博客 step2&#xff1a; 每次绑定远程仓库的时候&#xff0c;使用SSH绑定 如果已经绑定过了&…

虚拟化技术(KVM)基础

如何实现虚拟化技术&#xff1f; 三种类型的虚拟机管理软件Hypervisor KVM(kernrl -bsed v m) 环境检查和部署 一、虚拟化技术概述 虚拟化技术就是对资源的抽象 1.1、从资源提供角度分类 平台虚拟化即硬件平台虚拟化&#xff0c;可以把物理机的CPU和MEM提供给来宾主机做资源…

使用Electron来给若依系统打包成exe程序,出现登录成功但是不跳转页面(已解决)

阿丹&#xff1a; 之前解决了css找不到文件等问题&#xff0c;那么新问题就来了&#xff01; 问题描述&#xff1a; 进入到登录页面发现问题&#xff1a; 点击登录一直在转圈&#xff0c;但是不进去&#xff01;&#xff01;&#xff01; 更诡异的是&#xff01;后台相应的很…

vue启动失败;‘vue-cli-service‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件。

问题1&#xff1a; 启动vue项目失败&#xff1a; vue启动失败&#xff1b;‘vue-cli-service‘ 不是内部或外部命令&#xff0c;也不是可运行的程序 或批处理文件。 获或者问题2&#xff1a;npm i 失败&#xff1a; C:\Users\28602\AppData\Roaming\npm-cache_logs\2023-07-07…

一篇看懂web端音频

三方音频录制的库 recorder-core库&#xff1a; github地址&#xff1a;https://github.com/xiangyuecn/Recorder 支持录音格式&#xff1a;mp3 wav ogg webm amr pcm 该库基于Web Audio API&#xff08;html5&#xff09;的录音库&#xff0c;支持在大部分已实现getUserMedi…

安装yum源

三个源&#xff0c;httpd的&#xff1a; 首先&#xff1a;安装yum源 关闭防火墙和安全机制 然后访问本机ip 显示出来&#xff0c;删除掉&#xff0c;然后创建本地yum源 挂载&#xff0c;但是test没有 创建test&#xff0c;然后挂载 必须要进入到这个目录下创建挂载才行&…

(vue)el-table表格删除操作加气泡确认框

(vue)el-table表格删除操作加气泡确认框 效果&#xff1a; 代码&#xff1a; <el-table-column fixed"right" label"操作" width"120"><template slot-scope"scope"><el-popconfirm title"确定移除吗&#xff…

Keepalived及其工作原理

目录 一、keepalived概述 1.1.1 管理LVS负载均衡软件 1.1.2 支持故障自动切换&#xff08;failover&#xff09; 1.1.3 实现LVS集中节点的健康检查&#xff08;health checking&#xff09; 1.1.4 实现LVS负载调度器 节点服务器的高可用性&#xff08;HA&#xff09; 二、…

Stable Diffusion 使用lora-scripts WebUI训练LoRA模型

如果对代码使用有困难的小伙伴可以直接使用WebUI版的LoRA模块进行训练操作。不管是训练人物&#xff0c;场景&#xff0c;风格&#xff0c;还是服装都是一套通用的模式&#xff0c;仅仅是使用不同的数据集得到的结果不同。 文章目录 lora-scripts WebUI的安装LoRA训练过程SD切分…

【贪心】CF1845 C

Problem - C - Codeforces 题意&#xff1a; Code&#xff1a; #include <bits/stdc.h>//#define int long longusing namespace std;const int mxn3e510; const int mxe1e510; const int mod1e97; const int Inf0x3f3f3f3f;string s,l,r;int M;void solve(){s.clear…

前端部署--入门Vercel

Vercel Vercel 你可以理解为一个部署工具&#xff0c;支持部署静态网页和Node服务&#xff0c;部署后你还可以访问它自带生成的域名https。 模版支持 Nuxt.js: Vue的SSR框架 Hexo: 快速生成博客网站 Remix&#xff1a; 一款边缘原生的全栈 JavaScript 框架 … Vercel的核心…

免押租赁软件开发|租赁小程序适合各种产品开发

租赁小程序适合各种产品开发&#xff0c;特别是那些可以通过租赁方式提供给用户使用的产品。以下是一些适合开发租赁小程序的产品类型&#xff1a;   租房&#xff1a;租赁小程序可以方便房东和租客之间的房屋租赁交易。租客可以通过小程序浏览房源信息并联系房东&#xff0c…

力扣 | 数组和字符串简介

数组是数据结构中的基本模块之一。因为字符串是由字符数组形成的&#xff0c;所以二者是相似的。力扣LeetBook——数组和字符串 文章目录 &#x1f4da;数组简介&#x1f449;寻找数组的中心索引&#x1f449;搜索插入位置&#x1f449;合并区间 &#x1f4da;二维数组简介&…

adb连接安卓模拟器或真机hook参数加密详细过程(frida)

app逆向时&#xff0c;参数与函数的确定很关键&#xff0c;找到可疑的函数&#xff0c;不确定是否由该函数生成&#xff0c;该怎么解决&#xff1f;hook就应允而生了&#xff0c;首先是要求本地电脑和安卓模拟器&#xff08;网易mumu模拟器支持多系统&#xff0c;该模拟器作为主…