可变结构体

今天在看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] = '\0';

  printf( "myaddress->length=%d, myaddress->address=%s\n", myaddress->length, myaddress->address );
  free(myaddress);

  return 0;
}


为什么不把

    char  address[1];

换成

    char   *address;

呢?

那是因为替换之后,必须对address进行分配空间才能使用,需要多调用一次malloc(),同时,前者可以使结构体空间连续,后者无法保证到这一点。

还有另外一种做法是把

    char  address[1];

换成

    char   address[0];

这也是可行的,当然在分配内存大小时需要作出相应的修改,但是这种做法有一个缺点,就是C标准不支持,只有在GCC的编译环境下才能正常编译。

还有一点需要注意的是:在使用完结构体之后要记得释放内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值