以下是个人的理解,暂时学习到这。
一开始sizeof(msg_t)是4字节的,但是我们在给他的申请一多出来的部分就在data指针指向了,如果我们向后偏移的话,就偏移我们想要保存的数据长度(可以是任何你想要的)
多了不说了,请reading code
优点是内存管理方便,只需要 一次申请,一次释放,内存连续,节省空间。
(本文中只是为了看起来方便,所以将内容部分开了内存,实际上完全可以不开)。
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define MAX_MSG 7
typedef struct msg_info_s{
char name[16];
char msg_info[32];
}msg_info_t;
typedef struct msg_s{
int id;
char data[0];
}msg_t;
int main(int argc, char * argv [ ])
{
msg_info_t *prt_msginfo;
msg_info_t *msg_info = malloc(sizeof(msg_info_t)) ;
int i=0;
if(NULL == msg_info)
{
perror("creat malloc err");
exit(1);
}
msg_t *msg = malloc(sizeof(msg_t)+(sizeof(msg_info_t)*MAX_MSG));
if(NULL == msg)
{
perror("creat malloc err");
exit(1);
}
for(i =0 ; i < MAX_MSG ; i++)
{
msg->id =i;
sprintf(msg_info->msg_info,"new msg %d",i);
sprintf(msg_info->name,"name%d",i);
memcpy((msg->data+(sizeof(msg_info_t)*i)),msg_info,sizeof(msg_info_t));
}
for(i =0 ; i < MAX_MSG ; i++)
{
prt_msginfo = (msg_info_t *)(msg->data+(sizeof(msg_info_t)*i));
printf(" name=[%s] msg =[%s] \n",prt_msginfo->name,prt_msginfo->msg_info);
}
free(msg_info);
free(msg);
return 0;
}