可变长结构体
今天在看tinyxml源码的时候发现了在结构体使用数组长度为1的数据,如下:
struct Rep
{
size_type size, capacity;
char str[1];
};
这是之前没有接触过的,上网了解才知道这主要是为了实现可变长结构体,
下面是自己写的测试代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> struct lvt { size_t length; char address[1]; }; int main( int argc, char *argv[] ) { struct lvt *myaddress; char home[] = "guangzhou guangdong"; myaddress = (struct lvt*) malloc( sizeof(struct lvt)+strlen(home)*sizeof(char) ); myaddress->length = strlen(home); memcpy( myaddress->address, home, strlen(home) ); myaddress->address[myaddress->length] = " "; printf( "myaddress->length=%d, myaddress->address=%s ", myaddress->length, myaddress->address ); free(myaddress); return 0; }
char address[1];
换成
char *address;
呢?
那是因为替换之后,必须对address进行分配空间才能使用,需要多调用一次malloc(),同时,前者可以使结构体空间连续,后者无法保证到这一点。
还有另外一种做法是把
char address[1];
换成
char address[0];
这也是可行的,当然在分配内存大小时需要作出相应的修改,但是这种做法有一个缺点,就是C标准不支持,只有在GCC的编译环境下才能正常编译。
还有一点需要注意的是:在使用完结构体之后要记得释放内存。
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
copyright © 2008-2019 亿联网络 版权所有 备案号:粤ICP备14031511号-2