本文档主要介绍了存储器分配在ANSI C中的使用,涉及到动态内存管理的三个关键函数:malloc、calloc和realloc,以及释放内存的free函数。同时,文档还提及了UNIX环境中的高级编程知识,包括文件和目录管理、输入输出、进程、错误处理、用户标识、信号、时间值、系统调用和库函数等概念。
在C语言中,动态内存分配是通过以下三个函数来实现的:
1. `malloc`:它用于分配指定字节数的内存空间,但分配的内存区域的初始值是不确定的。例如,如果你需要分配10个整数的内存,可以使用`malloc(10 * sizeof(int))`。返回的指针可以用来访问这个内存块。
2. `calloc`:这个函数为指定数量的对象分配内存,每个对象的大小是预先给定的。不同于`malloc`,`calloc`会将分配的所有位都初始化为0。如果要分配10个整数且初始化为0,可以使用`calloc(10, sizeof(int))`。
3. `realloc`:这个函数用于改变之前分配的内存区域的大小,可以增加或减少。如果增加内存,可能会导致原有内容被移动到新位置,而新增部分的初始值未定义。例如,如果想将之前分配的10个整数的内存扩展到20个,可以使用`realloc(ptr, 20 * sizeof(int))`,其中`ptr`是原来的内存指针。
4. `free`:这个函数用于释放之前通过`malloc`、`calloc`或`realloc`分配的内存。调用`free(ptr)`后,相应的内存将被归还给系统。
在UNIX环境中,这些函数遵循一定的对齐规则,确保返回的指针可以用于存储任何类型的数据。例如,如果系统中最严格的对齐要求是double类型(8字节),那么分配的内存地址应该是8的倍数。由于这些函数返回的是void指针,可以直接赋值给其他类型的指针,无需显式类型转换,前提是已经包含了`<stdlib.h>`头文件。
文档还提到了一些UNIX基础概念,如:
- 文件系统、文件名和路径名:文件系统组织了文件和目录,文件名和路径名用于标识文件的位置。
- 输入和输出:包括文件描述符、标准输入/输出/错误,以及缓冲I/O和无缓冲I/O的概念。
- 进程和进程控制:进程是执行中的程序,有独立的进程ID,可以进行创建、终止和控制。
- 用户标识:包括用户ID和组ID,用于权限管理和访问控制。
- 信号:一种进程间通信的方式,用于发送异步通知。
- 时间值:UNIX时间戳用于表示时间。
- 系统调用和库函数:操作系统提供的低级接口和方便开发的函数库。
此外,文档还讨论了UNIX的标准化(如ANSI C、IEEE POSIX、X/Open)和不同实现之间的差异,以及如何处理各种限制和功能测试宏。文件I/O部分涵盖了打开、创建、关闭、定位、读写等操作,以及文件共享、原子操作和相关的系统调用函数。
这份资源提供了关于存储器分配和UNIX环境高级编程的详细知识,对于理解C语言的内存管理和UNIX系统编程是很有帮助的。