[C语言]——柔性数组

news2024/11/24 8:58:46

目录

一.柔性数组的特点

二.柔性数组的使用

三.柔性数组的优势


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

typedef struct st_type //typedef可以不写
{ 
 int i;
 int a[0];//柔性数组成员 
}type_a;

有些编译器会报错⽆法编译可以改成:

typedef struct st_type
{
 int i;
 int a[];//柔性数组成员 
}type_a;

一.柔性数组的特点

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

 只计算n的内存大小,计算柔性数组前的内存

例如:

typedef struct st_type
{
  int i;
  int a[0];//柔性数组成员 
}type_a;
  int main()
{
  printf("%d\n", sizeof(type_a));//输出的是4 
  return 0;
}

二.柔性数组的使用

//代码1 
#include <stdio.h>
#include <stdlib.h>
int main()
{
 int i = 0;
 type_a *p = (type_a*)malloc(sizeof(type_a)+100*sizeof(int));
 //业务处理 
 p->i = 100;
 for(i=0; i<100; i++)
 {
   p->a[i] = i;
 }
 free(p);
 p=NULL;
 return 0;
}

这样柔性数组成员a,相当于获得了100个整型元素的连续空间

三.柔性数组的优势

上述的 type_a 结构也可以设计为下⾯的结构,也能完成同样的效果。

//代码2 
#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;
}

上述代码1和代码2可以完成同样的功能,但是⽅法1的实现有两个好处:

  • 第⼀个好处是:⽅便内存释放如果我们的代码是在⼀个给别⼈⽤的函数中,你在里面做了⼆次内存分配,并把整个结构体返回给用户。用户调⽤free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能 指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返 回给用户⼀个结构体指针,用户做⼀次free就可以把所有的内存也给释放掉。
  • 第⼆个好处是:这样有利于访问速度.连续的内存有益于提⾼访问速度,也有益于减少内存碎片。(其实,我个⼈觉得也没多⾼了,反正你跑不了要⽤做偏移量的加法来寻址)

扩展阅读:C语言结构体里的成员数组和指针 | 酷 壳 - CoolShell

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

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

相关文章

14:00面试,15:00才出来,直接给我问麻了。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到3月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

基础语法复习

常用的定义&#xff1a; 读取数据加速&#xff1a; input sys.stdin.readline 设置递归深度&#xff1a; sys.setrecursionlimit(100000) 记忆化搜索&#xff1a; from functools import lru_cache lru_cache(maxsizeNone) 计数器&#xff1a; Counter 类是一个非常有…

Spring Cloud微服务入门(五)

Sentinel的安装与使用 安装部署Sentinel 下载Sentinel&#xff1a; https://github.com/alibaba/Sentinel/releases Sentinel控制台 https://localhost:8080 用户和密码为sentinel 使用Sentinel 加依赖&#xff1a; 写配置&#xff1a; 输入&#xff1a; java -Dserver.po…

【React】React hooks 清除定时器并验证效果

React hooks 清除定时器并验证效果 目录结构如下useTime hookClock.tsx使用useTime hookApp.tsx显示Clock组件显示时间&#xff08;开启定时器&#xff09;隐藏时间&#xff08;清除定时器&#xff09; 总结参考 目录结构如下 useTime hook // src/hooks/common.ts import { u…

lora微调过程

import os import pickle from transformers import AutoModelForCausalLM from peft import get_peft_config, get_peft_model, get_peft_model_state_dict, LoraConfig, TaskTypedevice "cuda:0"#1.创建lora微调基本的配置 peft_config LoraConfig(task_typeTask…

CAN和LIN的DB9接口定义

文章目录 前言一、DB9实物及引脚二、LIN DB9三、CAN DB9总结前言 在日常汽车总线测试中,最主要的通信网络就是CAN网络,小伙伴们在测试时,经常会遇到使用DB9插头来测试、录取CAN总线报文,但是DB9插头内有9个插针,哪2个才是CAN-H和CAN-L呢? 一、DB9实物及引脚 DB9 接口是…

杨辉三角形(蓝桥杯,acwing)

题目描述&#xff1a; 下面的图形是著名的杨辉三角形&#xff1a; 如果我们按从上到下、从左到右的顺序把所有数排成一列&#xff0c;可以得到如下数列&#xff1a; 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 6, 4, 1, ... 给定一个正整数 N&#xff0c;请你输出数列中第一次出现…

实验:基于Red Hat Enterprise Linux系统建立逻辑卷并进行划分

目录 一. 实验目的 二. 实验内容 三. 实验设计描述及实验结果 1. 为虚拟机添加三块大小为5GB的磁盘nvme0n2 nvme0n3 nvme0n4 2. 将三块硬盘转换为物理卷&#xff0c;并将nvme0n2 nvme0n3两pv建立成名为"自己名字_vg“的卷组&#xff0c;并将nvme0n4扩展进该卷组。 LVM管…

os.listdir()bug总结

今天测试出一个神奇的bug&#xff0c;算是教训吧&#xff0c;找了两天不知道问题在哪&#xff0c;最后才发现问题出现在这 原始文件夹显示 os.listdir()结果乱序 import os base_path "./file/"files os.listdir(base_path)print(files)问题原因 解决办法(排序) …

【论文解读】大模型事实性调查(上)

一、简要介绍 本调查探讨了大型语言模型&#xff08;llm&#xff09;中的事实性的关键问题。随着llm在不同领域的应用&#xff0c;其输出的可靠性和准确性变得至关重要。论文将“事实性问题”定义为llm产生与既定事实不一致的内容的概率。论文首先深入研究了这些不准确性的含义…

IO-DAY8

使用消息队列去实现2个终端之间的互相聊天 要求:千万不要做出来2个终端之间的消息发送是读一写的&#xff0c;一定要能够做到&#xff0c;一个终端发送n条消息&#xff0c;另一个终端一条消息都不回复 A终端&#xff1a; #include<myhead.h> typedef struct msgbuf {lon…

B02、执行引擎-5

1、前言 1.1、什么是机器码 各种用二进制编码方式表示的指令&#xff0c;叫做机器指令码。开始&#xff0c;人们就用它采编写程序&#xff0c;这就是机器语言。机器语言虽然能够被计算机理解和接受&#xff0c;但和人们的语言差别太大&#xff0c;不易被人们理解和记忆&#x…

基于SSM框架实现的在线心理评测与咨询系统(技术栈 spring+springmvc+mybatis+jsp+jquery+css)

一、项目简介 本项目是一套基于SSM框架实现的在线心理评测与咨询系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

小白学Java成长日记特别篇

晚上好&#xff0c;各位小伙伴。今天给大家带来的是Java的输出补充篇&#xff0c;前两篇说了输出和输入的大概&#xff0c;但我没有详细讲它俩&#xff0c;因此这篇文章来详细的聊一聊它俩。那么废话不多说&#xff0c;我们赶紧进入正题。 首先讲一讲这个Java的输出吧。 输出格…

使用MQTT.fx接入新版ONENet(24.4.8)

新版ONENet使用MQTT.fx 模拟接入 目录 新版ONENet使用MQTT.fx 模拟接入开始前的准备创建产品设备获取关键参数 计算签名使用MQTT.fx连接服务器数据流准备与上传数据流准备数据发送与接收 开始前的准备 创建产品 设备下载Token签名工具生成签名 创建产品设备 根据以下内容填写…

windows组播发不出去解决办法

由于开启了虚拟网卡&#xff0c;安装VMWare虚拟化软件&#xff0c;可能会通过虚拟网卡发送组播&#xff0c;需要禁用虚拟化网卡。

Linux网络名称空间的抽象设计以及借鉴意义

Linux作为一个强大的开源操作系统&#x1f427;&#xff0c;其网络虚拟化技术中的核心组件——网络名称空间&#xff08;Network Namespace&#xff09;&#xff0c;是对网络资源的一种高度抽象。网络名称空间允许系统内部存在多个隔离的网络环境&#xff0c;每个环境都有自己的…

数字图像处理与交叉学科中名词的拧巴

特征提取 图像处理——对图像、目标或特征点进行定量描述的方法及过程。 模式识别——对原特征进行特征变换&#xff0c;从高维空间到低维空间映射。 特征向量 模式识别、图像处理——一个观测包括多个变量&#xff0c;样本的多个特征组成特征向量。 线性代数——特征值对应的…

随机过程-BS定理

随机偏微分方程相比普通偏微分方程具有额外的随机项&#xff0c;反映了其描述的现象具有随机性质

请求转发和请求重定向的区别

请求转发(Forward)和请求重定向(Redirect)虽然都是 HTTP 服务器&#xff0c;处理客户端请求时进行(页面)跳转的实现方式&#xff0c;但是二者有以下 5 点不同: 1. 定义不同。 2. 跳转方不同。 3. 数据共享不同。 4.最终 URL 地址不同。 5.代码实现不同。 具体内容如下&…