什么叫变长结构体?
typedef struct
{
int a;
char b[0];
}Student;
那结构体是怎么实现可变长的呢?如上所示,请注意看结构体中的最后一个元素,一个没有元素的数组。我们可以通过动态开辟一个比结构体大的空间,然后让buffer去指向那些额外的空间,这样就可以实现可变长的结构体了。
下面我们来探讨动态开辟一个比结构体大的空间的问题,一般的实现思路都是开辟一个比结构体大的空间,如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int a;
char b[0];
}Student;
int main()
{
Student *tStudent = (Student *)malloc(sizeof(Student)+10);
char c[10]="123456789";
memcpy(tStudent->b,c,10);
printf("1.sizeof %ld\n",sizeof(Student));
printf("2.sizeof %s\n",tStudent->b);
printf("3.sizeof %ld\n",sizeof(tStudent));
return 0;
}
运行结果:
1.sizeof 4
2.sizeof 123456789
3.sizeof 8
那如果开辟的空间和结构一样大行不行呢,如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct
{
int a;
char b[0];
}Student;
int main()
{
//Student *tStudent = (Student *)malloc(sizeof(Student)+10);
Student *tStudent=(Student *)malloc(sizeof(Student));
char c[10]="123456789";
memcpy(tStudent->b,c,10);
printf("1.sizeof %ld\n",sizeof(Student));
printf("2.sizeof %s\n",tStudent->b);
printf("3.sizeof %ld\n",sizeof(tStudent));
return 0;
}
运行结果:
1.sizeof 4
2.sizeof 123456789
3.sizeof 8
可以看到结构体无论是开辟比结构体大的空间还是一样的空间,其结果结果都是一样的。