1 #include <stdlib.h> 2 #include <iostream> 3 #include <string.h> 4 5 using namespace std; 6 struct key 7 { 8 void *key; 9 int size; 10 }; 11 12 struct doclist 13 { 14 int i; 15 int j; 16 struct key k; 17 void *entry; 18 }; 19 20 int main() 21 { 22 doclist* d = (doclist*)malloc(sizeof(doclist) + 5); 23 d->i = 1; 24 d->j = 2; 25 key k; 26 k.key=(void*)malloc(5); 27 memset(k.key,'l',5); 28 d->k.key=d+1; 29 memcpy(d->k.key,k.key,5); 30 cout << "doclist:" <<sizeof(doclist)<<":"<<sizeof(*d)<<"\n"; 31 cout << "key:" << sizeof(key)<<":"<<sizeof(d->k)<<"\n"; 32 return 0; 33 }
d的地址为:
*d为:
其中i的地址为0x601010,j的地址为0x601014.其中每位地址对应一个byte的实际空间,而int的大小为4个byte。如下图
而d中key的地址为:0x601018,
因为分配空间是给d分配了sizeof(doclist) + 5大小的空间,且d的类型为doclist,所以d+1指向了0x601010+0x20(32即struct doclist大小)的地址,使用d->k.key=d+1将该5个大小的空间地址赋给key,使其可以进行空间操作。
而由于malloc时记录了给d分配了sizeof(doclist) + 5大小的空间,所以最后只需要free(d)即可,系统会自动将所以空间释放。如果单独为d->k.key分配空间,则最后还需要再释放d->k.key。