LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: asert

长度为0的数组能有什么用处?

[复制链接]
发表于 2007-10-12 23:07:49 | 显示全部楼层
Post by manphiz
realtang 前辈这段示例代码貌似来自:
http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html
但这段代码似乎存在内存泄露隐患: malloc 的长度和 struct line 的长度不一致,这样将来在 free(x) 的时候,势必 content_length 长度的内存将会泄露?还请 realtang 前辈指点。
或许那些不符合 C 标准的做法反而成为 C 被指责为不安全语言的例证


并非这样, free并不是根据指针类型来释放内存的,malloc申请的内存块与类型无关,类型是申请者考虑的因素, malloc只关注申请内存的大小。see man free

  1.        [b]void *[/b]malloc(size_t size);
  2.        void free([b]void *ptr[/b]);
复制代码


数组为0的例子,能想到比较而且需要的例子是通信的领域。 一个数据包括头部(header)和数据(payload), 头部一般有一字段指定数据长度。 但有时并没有数据要发送,为了让对端知道自己还是正常的,通信没有中断,可以发一个空包,在处理时可以用0大小的数组来表示空包。
一般如果不支持0大小数组的系统,在结构体定义的时候, 可以定义一个最小的数组(如数组大小为1),不过如果要发的是空包时, 这个大小为1的数组已经浪费了一些内存,在大容量的嵌入式系统的,这些浪费内存的相当宝贵。 至于数组越界,那是程序员要注意的事情,根数组大小是不是0没有什么关系。

以下的结构理论上也可以,但处理上已经不方便了, header 和 payload已经分离了。发送数据得根据payload或length的值调用两次memcpy 把要发送的数据复制到发送缓冲区。

  1. struct
  2. {
  3.      unsigned int length;
  4.      char* payload;
  5. }
复制代码
回复 支持 反对

使用道具 举报

发表于 2009-8-25 14:56:01 | 显示全部楼层
记不太清楚了,我记得好像可以利用这个特性在编译期间检查数组的越界问题还是什么来着,哪位能知道吗?谢谢。
回复 支持 反对

使用道具 举报

发表于 2011-4-16 19:48:37 | 显示全部楼层
请教各位,是不是可以利用malloc不能申请负数大小的特性来在编译期间防止内存越界的问题
起始地址start,用end - start来malloc,如果越界,这个差值会是负值,而如果每越界,那么可以正常malloc
我只模糊的记得这些了,各位是否有印象,如果有人碰巧知道,还请指教,谢谢!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表