现在的位置: 首页 > 综合 > 正文

长度为0的数组

2018年04月03日 ⁄ 综合 ⁄ 共 900字 ⁄ 字号 评论关闭

看一些开源项目时经常看到如下代码

  struct line {

  int length;

  char contents[0];

  };

注意上面最后一行的代码,这里定义了一个长度为0的数组,这种用法可以吗?为什么可以使用长度为的数组?长度为的数组到底怎么使用?

首先长度为0的数组在标准cc++中是不允许的,如果使用长度为的数组,编译时会产生错误,提示数组长度不能为0但在GNUc中,这种用法却是合法的它的最典型的用法就是位于数组中的最后一项,如上面所示,这样做主要是为了方便内存缓冲区的管理。如果你将上面的长度为的数组换为指针,那么在分配内存时,需采用两步:首先,需为结构体分配一块内存空间;其次再为结构体中的指针成员变量分配内存空间并赋值。这样两次分配的内存是不连续的,需要分别对其进行管理而且如果第二malloc失败了,必须回滚释放第一个分配的结构体,相当麻烦,释放也需要两次。但如果使用长度为0的数组时,则是采用一次分配的原则,一次性将所需的内存全部分配给它。相反,释放时也是一样的。

使用范例:

  struct line {

  int length;

  char contents[0];

  };

struct line *thisline = (struct line *)malloc (sizeof (struct line) + this_length);

thisline->length = this_length;

此时的contens直接指向了thisline+sizeof (struct line),是不是非常方便呢?

比起使用指针,用空数组有这样的优势:  

  1. 不需要初始化,数组名直接就是所在的偏移 。

   2.不占任何空间,指针需要占用int长度空间,空数组不占任何空间。 

3.分配的内存连续,管理方便。 

  4.小内存的管理是非常困难的,如果用指针,这个buffer的struct部分就是小内存了, 在系统内存在多了势必严重影响内存管理的性能。要是用空数组把struct和实际数据缓冲区一次分配大块问题,就没有这个问题,解决了小内存碎片问题提高了性能。
 

【上篇】
【下篇】

抱歉!评论已关闭.