变长结构体之结构体指针申请内存

it2023-01-12  56

什么叫变长结构体?

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

可以看到结构体无论是开辟比结构体大的空间还是一样的空间,其结果结果都是一样的。

最新回复(0)