零长数组

Arrays of Length Zero

这样说:

Zero-length arrays are allowed in GNU C. They are very useful as the last element of a structure that is really a header for a variable-length object

零长数组在GNU C中是允许的。结构体中最后一个元素,把他用作变长对象的头。Flexible array 即柔性数组。

但是在C++中,C++约定每个对象在内存中有唯一的地址,故零长数组在C++中其实长度是1

struct line {
       int length;
       char contents[0];
};
struct line *thisline = (struct line *) malloc (sizeof (struct line) + this_length);
thisline->length = this_length;

可能会有疑问这里为何不直接搞一个指针和len即可?

如果用指针的话,这里不能保证变长对象的地址和结构体连续。这里就是柔性数组的好处。

内存的连续:

  • 提升访问速度
  • 方便释放
时间: 2024-10-07 00:38:33

零长数组的相关文章

结构体最后的长度为0或1数组的作用--零长数组

其实很早在看LINUX下就看到这个东西,后来在李先静的<系统程序员成长计划>里看到了类似的定义,于是心里想着总结一下,结果发现网上已经有牛人总结的很好了,于是乎就转了过来,谢谢你们的分享,这是我前进的动力! 同时,需要引起注意的:ISO/IEC 9899-1999里面,这么写是非法的,这个仅仅是GNU C的扩展,gcc可以允许这一语法现象的存在.(C99允许.微软的VS系列报一个WARNING,即非常的标准扩展.) 结构体最后使用0或1的长度数组的原因,主要是为了方便的管理内存缓冲区,如果你直

零长度数组意义

在_C++ Primer_动态数组中提到:动态分配一个空数组是合法的. size_t n = get_size(); int* p = new int[n]; for(int* q = p; q != p + n; ++q) char arr[0];//错误 char cp = new char[0]; 当我们用new分配一个大小为0的数组时,new返回一个合法的非空指针.此指针保证与new返回的其他任何指针不相同,对于零长度的数组来说,此指针就像尾后指针一样.我们可以像尾后迭代器一样使用这个指

GCC对C的扩展总结

在Linux内核代码中,有非常多的代码使用了GCC的很多扩展特性,本篇文章主要是对这些特性做一个小小的总结,代码全部来自于GCC手册 1.被一对花括号包起来的代码块可以作为一个表达式来使用,花括号中可以使用循环语句(while.for),开关语句(if.switch),本地变量等.代码如下: 1 2 3 4 ({ int y = foo (); int z;     if (y > 0) z = y;     else z = - y;     z; }) 最后一条语句必须为一个表达式并以分号结

linux路由表命令

转自此大神http://www.cnblogs.com/gunl/archive/2010/09/14/1826234.html 留在好查阅 linux 路由表维护 查看 Linux 内核路由表 使用下面的 route 命令可以查看 Linux 内核路由表. # route Destination Gateway Genmask Flags Metric Ref Use Iface192.168.0.0 * 255.255.255.0 U 0 0 0 eth0169.254.0.0 * 255.

动态代理详解

1 学习动态代理的目的 动态代理技术都是在框架中使用,例如:Struts1.Struts2.Spring和Hibernate中都使用了动态代理技术.如果你不想自己写个框架,那么你基本上是用上不动态代理技术的.学习动态代理技术的目的是为了更好的理解框架内部的原理,也就是说是为了将来学习框架打基础!动态代理技术有点难度!而且明白了动态代理技术可能一时也想不到他适合在什么情况下使用它.这些东西都会在学习框架时渐渐明白. 2 运行时实现指定的接口 想实现某个接口,你需要写一个类,然后在类名字的后面给出"

GCC 对C语言的扩展

Linux内核必须使用GNU的GCC编译器来编译,而GCC提供了很多的C语言扩展,这些扩展对优化.目标代码布局.更安全的检查等提供了很强的支持.因此,内核代码所使用的C语法并不完全符合ANSI C标准,实际上,只要有可能,内核开发者总是要用到GCC提供的C语言扩展部分.所以特意找了几个常用的特性总结下. 1.语句内嵌表达式(statement-embedded expression) 在gnu c 中,用括号将复合语句括起来也形成了表达式.他允许你在一个表达式内使用循环,跳转和局部变量. 一个复

spring-AOP原理与应用

什么是AOP Spring是解决实际开发中的一些问题: * AOP解决OOP中遇到的一些问题.是OOP的延续和扩展. AOP作用 对程序进行增强:不修改源码的情况下. * AOP可以进行权限校验,日志记录,性能监控,事务控制. Spring的AOP的由来: AOP最早由AOP联盟的组织提出的,制定了一套规范.Spring将AOP思想引入到框架中,必须遵守AOP联盟的规范. 底层实现: 代理机制: * Spring的AOP的底层用到两种代理机制: * JDK的动态代理 :针对实现了接口的类产生代理

day21-基础加强

day21基础加强 今日内容 l 泛型 l 注解 l Servlet3.0 l 动态代理 l 类加载器 泛型 1 回顾泛型类 泛型类:具有一个或多个泛型变量的类被称之为泛型类. public class A<T> { private T t; public A(T t) { this.t = t; } public T get() { return t; } } 2 泛型方法 泛型方法的特点: l 方法的参数中会使用泛型变量: l 方法的返回值中会使用泛型变量. public <T>

结构体作为接口的注意事项

在后端向前端回复数据时,需要将结构化数据通过网络传输给前端,而网络传输是字节流传输,前端收到的是一段数据,那么,问题就落脚在如何解析这段数据. 很多请求的场景,返回的条数是动态变化的,比如订单数量.用户每下一个订单,那么请求返回的数量就会加1.这时候,如何较好的返回动态数据呢?这个看使用怎样的存储格式来承载可变长度的数据返回.就目前已知的处理方法: 使用 json 格式 使用 protobuf 格式 使用 struct 格式 由于工作需要,这里使用 struct 格式来进行数据的包裹. 固定长度