C语言变长数组 struct中char data[0]的用法

摘要:在实际的编程中,我们经常需要使用变长数组,但是C语言并不支持变长的数组。此时,我们可以使用结构体的方法实现C语言变长数组。


/struct MyData 
/{
/ int nLen;
/ char data[0];
/}; 
在结构中,data是一个数组名;但该数组没有元素该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
实际用时采取这样:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData )+strlen(str))
这样就可以通过p->data 来操作这个str。

程序实例:


/struct MyData 
/{
/ int nLen;
/ char data[0];
/};
/
/int main()
/{
/ int nLen = 10;
/ char str[10] = "123456789";
/
/ cout << "Size of MyData: " << sizeof(MyData) << endl;
/
/ MyData *myData = (MyData*)malloc(sizeof(MyData) + 10);
/ memcpy(myData->data, str, 10);
/
/ cout << "myData's Data is: " << myData->data << endl;
/
/ free(myData);
/
/ return 0;
/}

输出:

/Size of MyData: 4
/myData"s Data is: 123456789

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

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

相关文章

MOS管的实际应用

继上一篇“认对画对MOS管”后&#xff0c;现在小结一下MOS管的具体应用&#xff1a; 应用MOS管前&#xff0c;理解MOS管每个参数的具体意义后&#xff0c;再额外注意一下管子本身的体二极管&#xff0c;本身Vf1.6V&#xff0c;导通后管子本身阻抗一般是mΩ级&#xff1b;管子厂…

imp导入前对当前用户清库脚本

--清空当前用户所有表begin for i in ( select drop table || a.tab_name as sqls from (select distinct t.tab_name from (select Lower(table_name) as tab_name from user_tables) t) a ) loop dbms_output.put_line(i.sqls); execute immediate i.sqls; end loop;end;/--清…

Spring - Spring Boot Spring Cloud

Spring -> Spring Boot > Spring Cloud 这几天刚刚上班&#xff0c;公司用的是Spring Cloud&#xff0c;接触不多。我得赶快学起来。 想学习就必须得知道什么是微服务&#xff0c;什么是Spring Boot&#xff0c;什么是Spring Cloud&#xff0c;以及两者之间有什么关系&am…

C语言 · 前10名

算法提高 前10名 时间限制&#xff1a;1.0s 内存限制&#xff1a;256.0MB问题描述数据很多&#xff0c;但我们经常只取前几名&#xff0c;比如奥运只取前3名。现在我们有n个数据&#xff0c;请按从大到小的顺序&#xff0c;输出前10个名数据。输入格式两行。第一行一个整数n…

ssacanf\Sprintf格式化字符串

一、sscanf sscanf() - 从一个  int sscanf(const char *buffer,const char *format,[argument ]...); buffer 存储的数据 format 格式控制字符串 argument 选择性设定字符串 sscanf会从buffer里读进数据&#xff0c;依照argument的设定将数据写回。字符串中读进与指定格式相…

防火墙规则

1、iptables -t -L -n -t指定表格 -L 显示目前表格的规则 -n 数字显示2、iptables-save 以命令方式显示规则3、清除清空filter从头制定规则 ipatables -F 清除已经定义 iptables -X 清除自定义链 iptables -z 清除链统计和计数4、设定默认规则,当所有规则不匹…

JAVA中循环删除list中元素的方法总结

印象中循环删除list中的元素使用for循环的方式是有问题的&#xff0c;但是可以使用增强的for循环&#xff0c;然后今天在使用时发现报错了&#xff0c;然后去科普了一下&#xff0c;再然后发现这是一个误区。下面就来讲一讲。。伸手党可直接跳至文末。看总结。。 JAVA中循环遍历…

直流有刷电机与无刷电机的区别

首先介绍有刷电机与无刷电机工作原理&#xff0c;最后从调速方式及性能差异这两个方面详细的阐述了有刷电机与无刷电机的区别。 有刷电机与无刷电机工作原理 1、有刷电机 电机工作时&#xff0c;线圈和换向器旋转&#xff0c;磁钢和碳刷不转&#xff0c;线圈电流方向的交替变化…

MapReduce详解

MapReduce简介 MapReduce是一种编程模型&#xff0c;用于大规模数据集&#xff08;大于1TB&#xff09;的并行运算。概念"Map&#xff08;映射&#xff09;"和"Reduce&#xff08;归约&#xff09;"&#xff0c;是它们的主要思想。 MapReduce极大地方便了编…

JavaScriptBreak 语句 continue 语句

break 语句用于跳出循环。 continue 用于跳过循环中的一个迭代。 Break 语句 我们已经在本教程之前的章节中见到过 break 语句。它用于跳出 switch() 语句。 break 语句可用于跳出循环。 continue 语句跳出循环后&#xff0c;会继续执行该循环之后的代码&#xff08;如果有的话…

kernel mtd 分区与UBOOT 分区的理解

今天做内核移植&#xff0c;准备添加NAND flash的驱动&#xff0c;做到MTD分区时&#xff0c;想起在一本书上看到的一句话&#xff0c;说的是分区时每个区之间没有间隙&#xff0c;前一个区的结束地址是后一个区的起始地址。可是当我看我的开发板的教程时&#xff0c;分区如下&…

运放的主要参数详细介绍

1. 引言 运放的作用是调节和放大模拟信号&#xff0c;它是用途十分广泛的器件&#xff0c;接入适当的反馈网络&#xff0c;可用作精密的交流和直流放大器、有源滤波器滤波器、振荡器振荡器及电压比较器。其应用领域包括但不限制通讯、电子、汽车、工业检测等等&#xff0c;并将…

FastDFS 文件上传工具类

FastDFS文件上传工具类 import org.csource.common.NameValuePair;import org.csource.fastdfs.ClientGlobal;import org.csource.fastdfs.StorageClient1;import org.csource.fastdfs.StorageServer;import org.csource.fastdfs.TrackerClient;import org.csource.fastdfs.Tra…

MOS管的主要参数与重要特性

双极性晶体管&#xff1a;NPN和PNP管&#xff1b; 单极性晶体管&#xff1a;场效应管&#xff08;MOSFET和JFET&#xff09;&#xff1b; MOS管相对三极管具有速度快、输入阻抗高、噪声低、动态范围大、功耗小、容易集成等优点。 下面总结下其主要参数与重要特性&#xff0c…

【Codeforces Round #430 (Div. 2) B】Gleb And Pizza

【链接】点击打开链接 【题意】 在这里写题意【题解】 根据圆心到原点的距离这个东西判断一下圆在不在那个环里面就好【错的次数】 0【反思】 在这了写反思【代码】 #include <cstdio> #include <iostream> #include <algorithm> #include <cstring> #…

垂直居中方法总结

<style>#box{position: absolute;margin: auto;top:0px;right: 0px;bottom: 0px;left: 0px;width: 100%;height: 30%;background-color: red;text-align: center;} </style> <body><div id"box"><h1>文字居中</h1></div> …

NAND 坏块管理

NAND的操作管理方式 NAND FLASH的管理方式&#xff1a;以三星FLASH为例&#xff0c;一片Nand flash为一个设备(device)&#xff0c;1 (Device) xxxx (Blocks)&#xff0c;1 (Block) xxxx (Pages)&#xff0c;1(Page) 528 (Bytes) 数据块大小(512Bytes) OOB 块大小(16Bytes&…

js备忘录模式——实现分页点击已经请求过上一页的数据(读js设计模式)

例子&#xff1a;新闻数据实现分页||点击下一页后又点击上一页后不用再次请求数据&#xff0c;避免资源浪费&#xff0c;网速不好&#xff0c;用户体验效果差 备忘录模式&#xff1a;在不破坏对象的封装性的前提下&#xff0c;在对象之外捕获并保存该对象内部的状态以方便日后对…

运放的典型电路举例与计算仿真

运放电路的计算&#xff0c;通过记各种公式很难记住&#xff0c;但是掌握其两个重要概念&#xff0c;所有计算均可迎刃而解。 那就是运放的两个重要特性&#xff1a; 虚断&#xff1a;运放本质特性&#xff0c;输入阻抗大&#xff0c;两个输入端视为等效开路&#xff1b; 虚…

【SPOJ 694】Distinct Substrings (更直接的求法)

【链接】h在这里写链接 【题意】 接上一篇文章【题解】 一个字符串所有不同的子串的个数∑(len-sa[i]-height[i])【错的次数】 0【反思】 在这了写反思【代码】 #include<bits/stdc.h> using namespace std;const int N 2e3; const int MAX_CHAR 300;//每个数字的最大…