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

一、用法

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.使用指针,就要先释放指针所指的内存在释放整个结构体的内存,否则会照成内存泄露。
posted @   TechNomad  阅读(248)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示