char data[0]用法总结

2023-10-26

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。

         示例:
#include <iostream>

using namespace std;

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        
由于数组没有元素,该数组在该结构体中分配占用空间,所以sizeof(struct Mydata) = 4。
         malloc申请的是14个字节的连续空间,它返回一个指针指向这14个字节,强制转换成struct INFO的时候,前面4个字节被认为是Mydata结构,后面的部分拷贝了“123456789”的内容。

 

在读程序中经常会看到这样的定义char data[0],这是一个什么样的用法,有什么好处,在哪些地方用到?

本文的主要目的就是阐明这个定义的作用,以及适用范围,这需要对指针的概念和操作系统的内存模型有一个情形的认识。

首先看一段程序:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

typedef struct _Info

{

    int i;

    char data[0];

}Info;

 

int main(int argc, char* argv[])

{

    printf("%d/n",sizeof(Info));

    return 0;

}

程序的执行结果是:4。整数i就占了4个字节,这表明data没有占用空间。data是一个数组名;该数组没有元素;该数组的真实地址紧随结构体Info之后;这种声明方法可以巧妙的实现C语言里的数组扩展。

记住上面的结构体不同于:

typedef struct _Info

{

    int i;

    char* data;

}Info;

这个结构体占用8个字节的空间,因为指针类型要占用4个字节的空间。

再看一个例子:

#include <stdio.h>

#include <string.h>

#include <stdlib.h>

 

typedef struct _Info

{

    int i;

    char data[0];

}Info;

 

int main(int argc, char* argv[])

{

    char buf[10] = "123456789";

    void* p = NULL;

 

    printf("%d/n",sizeof(Info));

   

    Info* info = (Info*)malloc(sizeof(Info) + 10);

    p = (void*)info->data;

    printf("addr of info is %p. addr of data is %p ./n", info, p);

   

    strcpy((char*)p, buf);

    printf("%s/n", (char*)p);

 

    return 0;

}

程序的执行结果见下图:

可知,data的地址是紧随结构体之后的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

char data[0]用法总结 的相关文章

随机推荐

  • Makefile = 、:=、?=的区别

    相当于 c 语言中的 预编译的过程 在真正解释Makefile前会先将对应的 号左边的量替换成右边的量 而 则是跟 宏观的 号相似 是简单赋值的运算符号 下面举个例子就可以清楚的知道它们之间有何不同 cross arm linux cc c
  • 开关电源怎么测试文波_为什么开关电源需要测试动态响应

    1 导读概念动态响应一般是指控制系统在典型输入信号的作用下 其输出量从初始状态到最终状态的响应 对某一环节 系统 加入单位阶跃输入x t 时 其响应y t 开始逐渐上升 直到稳定在某一定值上为止 响应y t 在达到一定值之前的变化状态称为过
  • 直播分发选低延迟 RTC 还是 CDN?

    简单来看 一个完整的直播应用实现原理是 主播端采集音视频 推到服务器 再由服务器分发给观众观看 主播端负责推流 需要配置选用 RTC 链路分发直播画面或者用 CDN 链路分发 如果涉及连麦还需要考虑如何做 MCU 合流 观众订阅合流的好处是
  • python 读取配置文件config_python学习-读写配置文件-ConfigParse用法

    一 读取配置文件 config ini read filname 读取文件内容 section 获取所有section 返回list options section 获取该section所有options 返回list items sect
  • IDEA + SSH OA 第一天(Hibernate : Mapping (RESOURCE) not found)

    切入主题 看看今天的错误是如何发生的 首先这是我的项目路径 java 是 Sources Root resources 是 Resources Root 放了所需要的配置文件 其中 Hibernate 的配置 显示的是绿色 说明没有问题 在
  • Java基础知识-Map

    1 Map体系 2 各实现类说明及区别 3 哈希映射技术 哈希映射技术是一种就元素映射到数组的非常简单的技术 由于哈希映射采用的是数组结果 那么必然存在一中用于确定任意键访问数组的索引机制 该机制能够提供一个小于数组大小的整数 我们将该机制
  • Windows和Ubuntu下Firefox账号不能同步的解决办法

    最近开始用Ubuntu系统发现一个问题 我在Ubuntu系统自带的或者软件中心下的Firefox版本下创建一个账号 再在Windows的Firefox下登录发现此账号不存在 原因是Firefox有个全球服务和本地服务 Ubuntu下的Fir
  • vscode c++安装与单文件多文件编译配置(win10)

    vscode c 安装与单文件多文件编译配置 win10 总体思路 1下载Vscode mingw cmake 用于多文件编译 2配置 1 gt mingw vscode cmake环境变量 2 gt vscode 插件Chinese co
  • Redis多线程与ACL

    Redis是单线程吗 Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的 这也是 Redis 对外提供键值存储服务的主要流程 但 Redis 的其他功能 比如持久化 异步删除 集群数据同步等 其实是由额
  • JS中正则表达式常用语法总结

    目录 一 正则表达式的创建 二 的区别 三 和 四 d s w 五 六 test match 七 支持正则表达式的 String 对象的方法 一 正则表达式的创建 JS正则的创建有两种方式 new RegExp 和 直接字面量 使用RegE
  • Java Remote Debug(IDEA实现远程调试)

    前言 介绍 Java Remote Debug指的是 Java远程调试 特别是当你在本地开发的时候 你需要调试服务器上的程序时 远程调试就显得非常有用 本人就遇到这样一个问题 本地环境运行一切正常 但是部署到服务器就报错 而且问题一直找不到
  • ctfshow中web入门题关键解题思路

    一 信息搜集 1 web1 查看页面源代码 2 web2 burdsuite抓包 3 web3 burdsuite抓包 4 web4 查看robots txt文件 5 web5 查看index phps文件 6 web6 一般网站开发的源代
  • 开源IaaS云平台的分析与比较

    http blog csdn net jiayuboxin article details 11934223 http blog csdn net jiayuboxin article details 10977429 Project Sa
  • Dirichlet分布的推导与理解

    1 概述 Dirichlet 分布与贝塔分布 伽马分布有着紧密的联系 在贝叶斯统计中经常被用作其它概率分布如多项分布的先验分布 且在LDA分析中得到了广泛应用 本文结合直观理解以及详细的数学推导得到狄利克雷分布具体形式 并结合可视化以加深理
  • 解决Android Studio连接不上逍遥模拟器的问题

    1 打开逍遥模拟器 2 打开Android Studio 所要运行的项目 3 cmd 打开命令提示符 然后输入 adb connect 127 0 0 1 21503 然后回车 OK搞定 屡试不爽 看下图 其他模拟器参考这里点击打开链接
  • 在什么场景下要使用类方法

    静态方法和类方法的比较 静态方法 我们先来创建一个类 假设他是检测报告的相关信息 class Report inspection negative def init self name id number self name name se
  • 【Block-Level Verification】 SystemVerilog 数据类型_数组操作_队列_结构体_枚举类型_字符串_过程块和方法_变量生命周期_例化和链接...

    System Verilog芯片验证 System Verilog语言 1 数据类型 Verilog本身是来做硬件描述 是对硬件本身的行为进行建模 SystemVerilog是Verilog的生命延续 sv是对SystemVerilog进行
  • powershell定义命令(四)

    using System using System Collections Generic using System Collections ObjectModel using System ComponentModel using Sys
  • OpenCV3历程(5)——裂缝的检测与测量

    一 开始先介绍几个即将用到的函数及知识点 1 LUT函数 函数简介 void LUT InputArray src 原始图像的地址 InputArray lut 查找表的地址 对于多通道图像的查找 它可以有一个通道 也可以与原始图像有相同的
  • char data[0]用法总结

    struct MyData int nLen char data 0 开始没有理解红色部分的内容 上网搜索下 发现用处很大 记录下来 在结构中 data是一个数组名 但该数组没有元素 该数组的真实地址紧随结构体MyData之后 而这个地址就