结构体的不定长数组
结构体数组不定长的做法,有两种
第一种: 指针
第二种:长度为0的数组
1. 结构体的数组指针
特点:
- 结构体初始化时,可以是结构体指针,如struct tag_info *pInfo = NULL; 也可以是结构体变量, 如 struct tag_info Info = {‘\0’};
- 使用结构体里面的指针时,必须申请内存,进行初始化
2. 结构体长度为0的数组
特点:
- 结构体初始化时,必须是结构体指针;
- 长度为0的数组必须是放在结构体的最末尾
- 不占用结构体的大小,即sizeof结构体不包含buf[0]的大小
3. 结构体长度为0的数组
3.1 结构体如下定义:
typedef struct tag_info
{
int size;
int nums;
char buf[0];
}Info_t;
3.2 结构体初始化:
Info_t *pinfo = (Info_t*)calloc(1, sizeof(Info_t)+128);
if(pinfo == NULL)
{
printf("calloc for info.buf failed\r\n");
return -1;
}
pinfo->size = 128; // 128 为 buf[0]的长度
pinfo->nums = 1;
4. 完整例子
#include <stdio.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
typedef struct tag_info
{
int size;
int nums;
char buf[0];
}Info_t;
int main(int argc, char const argv[])
{
Info_t *pinfo = (Info_t*)calloc(1, sizeof(Info_t)+128);
if(pinfo == NULL)
{
printf("calloc for info.buf failed\r\n");
return -1;
}
pinfo->size = 128;
pinfo->nums = 1;
memset(pinfo->buf, '\0', pinfo->size);
snprintf(pinfo->buf, pinfo->size, "hello world\r\n");
printf("pinfo->buf: %s\r\n", pinfo->buf);
free(pinfo);
pinfo = NULL;
return 0;
}