一、用法
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中存放的便是拷贝的内容。