主要观点:
- 介绍了多种 UNIX 相关系统的程序员手册、用户手册及相关规范中关于
malloc
和realloc
的实现及变化。 - 涵盖了不同版本的 UNIX(如第五版、第六版、第七版等)、BSD 系列(如 4.2bsd、4.3bsd、4.4bsd 等)、SunOS 系列(如 3.4、4.1.3 等)、Solaris 以及 System V 等系统的相关内容。
- 探讨了
realloc(…, 0)
的行为及其在不同标准和实现中的差异。
关键信息:
- 不同版本的 UNIX 系统在
malloc
和realloc
的实现上有所不同,如第五版和第六版没有malloc
,第七版有malloc
和realloc
等。 - BSD 系列系统在不同版本中对
malloc
的实现进行了调整,如 4.2bsd 有新的分配器。 - System V 系列在不同版本中对分配器的修改相对较小,SysVr2 和 SysVr3 新增了
malloc(3X)
。 realloc(…, 0)
的行为在不同标准和实现中存在差异,C89 规定其行为与不允许零大小对象的策略一致,但与现存实现不一致,C23 将其定义为未定义行为。
重要细节:
- 各版本系统中
malloc
和realloc
的具体实现代码路径,如不同版本的usr/man/man3/malloc.3
、usr/src/libc/gen/malloc.c
等文件。 - System V 系列中关于
malloc(3X)
的相关内容,包括其功能、警告等。 - 不同系统中
realloc(0)
的行为,如某些系统中返回NULL
,某些系统中会释放指针等。
结论:
- 在所调查的范围内,每个
realloc(…, 0)
的行为与malloc
一致,每个默认的malloc(0)
行为类似于malloc(n); n > 0
,且这是有文档记录的,但并非像今天这样明确。 - SysVr2 的
-lmalloc
实现破坏了这一行为,且该差异未被文档记录,但作者需明确选择该实现,这在一定程度上是可以接受的。 - AT&T 发布的 SVID 将
malloc(3X)
扩展呈现为通用基线接口,与其他实现的隐含文档相矛盾。 - XPG 未能正确处理这一差异,后来的标准进行了修正。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。