首页 > 其他分享 >变长结构体中char data[0]的用法

变长结构体中char data[0]的用法

时间:2022-08-30 14:11:19浏览次数:44  
标签:char Header 内存 体中 结构 data 指针

一、用法

typedef struct {
    int length;
    char data[0];
}Header;

在结构中,data是一个数组名,但该数组没有元素,该数组的真实地址紧随结构体Header之后,而这个地址就是结构体后面数据的地址。如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容。

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

using namespace std;

typedef struct {
    int length;
    char data[0];
}Header;

int main()
{ 
    char buffer[] = "Hello World";
    int nLength = sizeof(Header);

    cout << "nLength:" << nLength << endl;

    Header *pHeader = (Header*)malloc(sizeof(Header) + strlen(buffer));
    memcpy(pHeader->data, buffer, strlen(buffer));

    cout << "pHeader->data:" << pHeader->data << endl;

    free(pHeader);

    return 0;
}

输出:

nLength = 4

pHeader->data = "Hello World"

由于数组没有元素,该数组在该结构体中不占用内存空间,所以sizeof(Header) = 4。
malloc申请的是strlen(buffer)个字节的连续空间,它返回一个指针指向这strlen(buffer)个字节,强制转换成Header的时候,前面4个字节被认为是Header结构,后面的部分拷贝了"Hello World"的内容,也就说pHeader->data中存放的便是拷贝的内容。

二、优点

1.指针可以放在任何地方,但是变长结构体的变长部分一定要放在结构体的最后。 2.指针会占一个指针的大小的内存空间,但是变长数组是不占内存的,它只是一个占位符。 3.指针指向的内存和结构体的内存可以是不连续的,但是变长部分和结构体的内存必须是连续。 4.使用指针,就要先释放指针所指的内存在释放整个结构体的内存,否则会照成内存泄露。

标签:char,Header,内存,体中,结构,data,指针
From: https://www.cnblogs.com/QingYiShouJiuRen/p/16639104.html

相关文章

  • 通过toDS()方法创建Dataset
    objectCreateDatasetByToDs{defmain(args:Array[String]):Unit={valconf=newSparkConf().setAppName("demo01").setMaster("local[*]")valsessio......
  • DataFrame中的行动算子操作2
    ##修改hdfs-site.xml<property><name>hive.metastore.warehouse.dir</name><value>hdfs://node1:9000/user/hive/warehouse</value><description>locationof......
  • DataFrame中的行动算子操作1
    valconf=newSparkConf().setAppName("action").setMaster("local[*]")valsession=SparkSession.builder().config(conf).getOrCreate()valseq:Seq[(String,In......
  • charles手机设置代理后,网络不可用的解决方法
    1:charles手机设置代理后,网络不可用无法下载证书的原因:电脑防火墙开启2:解决方法:关闭防火墙3:windows11关闭防火墙步骤:开始-设置  搜索框搜:防火墙,点击windowsdefend......
  • pycharm2022.2.1版本设置中文语言
    进入"File......
  • pulsar data
    干扰标记rfifind-time2.0-ofilename*.fits消色散DMprepdata-nobary-dm10.0-mask*.mask-ofilename_DM10.0*.fits快速傅里叶变换,将时域信号变成频域信......
  • c# form-data上传图片流到远程服务器
     先贴代码,后面做一些简单说明:publicstaticstringsendPostHttpRequest_2(stringurl,byte[]postBytes,stringcontentType="multipart/form-data;boundary=---......
  • DataFrame与rdd之间的转换(val rdd1 = dataFrame.rdd)
    核心语句valrdd1=dataFrame.rddpackageSparkSQL.DataFreamCreate.dataframetorddimportorg.apache.spark.SparkConfimportorg.apache.spark.rdd.RDDimportorg.......
  • 【MySQL】DDL因Waiting for table metadata lock卡住
    在数据库空闲时间,对表做碎片整理:altertablemy_abcengine=innodb;发现会话被阻塞,显示状态是:Waitingfortablemetadatalock 手动断开alter操作后,通过showpr......
  • multipart/form-data
    form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式application/x-www-form-urlencoded:默认编码方式multipart/form-data:指定传输数据为二进制数......