变长结构体中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.使用指针,就要先释放指针所指的内存在释放整个结构体的内存,否则会照成内存泄露。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?