问题:当进行内存管理时,经常需要一个额外的结构,例如
struct MyData
{
char*data; // 指向分配的内存空间
intlen; // 记录空间大小
};
这样,需要进行四步操作,先分配MyData结构体,再分配要管理的内存,再让data指针指向该内存空间,再把空间大小赋给len。问题,该结构在64位系统上sizeof结果是多少?可以修改结构体的情况下有什么办法能够减少操作?
这实际上是有关char data[0]的问题。
struct MyData
{
int len;
char data[0]; // 一定是结构体的最后一个字段,且前面必须有其他字段
};
在结构中,data是一个数组名;但该数组没有元素;由于数组没有元素,该数组在该结构体中不占用空间,所以sizeof(struct Mydata) = 4,这不同于char* data,要占用一个指针的大小(32位系统下4字节,64位系统8字节)。该数组的真实地址紧随结构体MyData之后,而这个地址就是结构体后面数据的地址(如果给这个结构体分配的内容大于这个结构体实际大小,后面多余的部分就是这个data的内容);这种声明方法可以巧妙的实现C语言里的数组扩展。
使用:
struct MyData *p = (struct MyData *)malloc(sizeof(struct MyData)+strlen(str))
这样就