前言

在标准C和C++中,长度为0的数组是被禁止使用的。不过在GNUC中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0]; 很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在这儿,它表示的完全是另外的一层意思, 这个特性是不可移植的, 所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,这些Trick最好还是收起来的好。

本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

正文

在GNU的指南中,它是如此写道:

struct line {
int length;
char contents[];
}; //...ommit code here {
struct line *thisline
= (struct line *) malloc (sizeof (struct line) +this_length);
thisline->length = this_length;
}

这个用法主要用于变长Buffer,structline的大小为4,结构体中的contents[0]不占用任何空间,甚至是一个指针的空间都不占, contents在这儿只是表示一个常量指针,这个特性是用编译器来实现的,即在使用thisline->contents的时候, 这个指针就是表示分配内存地址中的某块buffer,比如malloc(sizeof (struct line) +this_length)返回的是0x8f00a40,thisline->contents指向的位置就是(0x8f00a40+ sizeof(struct line)),而这儿sizeof(struct line)仅仅是一个int的四字节。

对于这个用法,我们定义的结构体指针可以指向任意长度的内存buffer,这个技巧在变长buffer中使用起来相当方便。可能有朋友说,为什么不把最后的contents直接定义为一个指针呢?这儿的差别是这样的,如果定义为一个指针,它需要占用4Bytes,并且在申请好内存后必须人为赋地址才可以。如果使用这个用法,这个常量指针不占用空间,并且无需赋值。 但是,方便并不是绝对的,在释放分配的内存的时候,由于函数free会认为*thisline只是指向一个4字节的指针,即只会释放length的空间,而对于后面占据大头的buffer却视而不见,这个就需要人为干预;而对于后面的声明指针的方式,则可以直接用Free(thisline->contents)的方式释放掉分配的内存。

ASSERT:除非必要,不要轻易使用这个功能,GNUC下可以编译通过,所以你在使用vc++,那就不用尝试了,编译都无法通过。

作者

出处:http://www.cnblogs.com/gina

本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

最新文章

  1. java 单例设计模式
  2. Lock锁
  3. jetty简介
  4. VS2010配色方案
  5. flask中jinjia2模板引擎使用详解1
  6. 读书笔记-JavaScript高级程序设计(1)
  7. Vue的基本使用
  8. maven手动安装jar包到本地仓库,以ojdbc6为例
  9. day09 python之函数进阶
  10. 学习日 day1
  11. [Luogu4986] 逃离
  12. 【java编程-Javassist】秒懂Java动态编程(Javassist研究)
  13. find和find_if,value_type
  14. 20155209 林虹宇Exp2 后门原理与实践
  15. 使用 Java DB (Derby) 数据库
  16. CentOS下Docker与.netcore(四)之 三剑客之一Docker-machine+jenkins简单自动化部署
  17. LengthOfLastWord,字符串最后一个子串的长度
  18. Python 对Twitter tweet的元素 (Word, Screen Name, Hash Tag)的频率分析
  19. 解决 eclipse cdt 运行时控制台乱码解决
  20. java实现MQ消息收发两种方式

热门文章

  1. 【bzoj1502】月下柠檬树
  2. 使用 openssl 生成证书(转)
  3. POJ--2752
  4. 洛谷P3048 [USACO12FEB]牛的IDCow IDs
  5. javascript基本介绍
  6. 清除localstorage
  7. NOIP模拟赛10
  8. 「LibreOJ β Round #4」子集
  9. 贪心+离散化+线段树上二分。。。 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest G. Of Zorcs and Axes
  10. 基础但是很重要的2-sat POJ 3678