"这篇复习资料主要涵盖了C语言中的动态存储管理,特别是动态申请存储空间的函数`malloc()`,以及相关的`free()`和`realloc()`函数。同时,还提及了宏定义、typedef的应用以及指针的基本概念。"
在C语言中,动态内存管理允许程序在运行时根据需要分配和释放内存。`malloc()`函数是动态内存分配的关键,其函数原型为`void *malloc(unsigned int size)`,它接受一个无符号整型参数`size`,表示要申请的字节数。`malloc()`返回的是一个无类型的指针,指向分配到的内存块的起始位置。为了能够正确使用这个内存,通常会将其转换为特定数据类型的指针。例如,如果要分配20个整数大小的内存,可以写为`int *p = (int *)malloc(20 * sizeof(int))`。需要注意的是,如果`malloc()`返回`NULL`,表示内存分配失败,程序应处理这种情况。
`free()`函数用于释放之前通过`malloc()`或`calloc()`分配的内存。例如,如果`pd`是一个指向结构体的指针,且内存已经分配,那么`free(pd)`将释放这块内存。释放内存后,不再使用的指针应设为`NULL`,以避免悬挂指针的问题。
`realloc()`函数则用于改变已分配内存区域的大小。其原型为`void *realloc(void *ptr, size_t size)`,`ptr`是先前分配的内存的指针,`size`是新的字节大小。`realloc()`可以扩大或缩小内存块,如果扩大内存成功,返回新分配的内存的起始地址;如果缩小内存,返回的仍然是原来的`ptr`,未使用的部分会被释放;如果无法满足新的内存需求,可能会返回`NULL`,原有内存保持不变,此时需要检查返回值并处理可能的错误。
宏定义是预处理器的一种功能,可以创建代号(宏名)来替代文本。无参数的宏定义简单地替换标识符,而带参数的宏定义则允许参数化替换,提高代码的可复用性。例如,`#define S(a, b) a * b` 可以用来求两个数的乘积。
typedef是C语言中的一个关键字,用于创建类型别名。例如,`typedef int ElemType`可以将`int`类型命名为`ElemType`,方便代码阅读和类型管理。数组类型的typedef可以简化多数组定义,如`typedef int ARR[10];`,之后可以使用`ARR a, b, c, d;`来定义四个长度为10的整型数组。
指针是C语言中强大的工具,它可以存储变量的地址。指针变量需要声明其指向的数据类型,并通过`&`运算符获取变量的地址,`*`运算符用于解引用指针,访问其所指向的值。指针变量的大小通常是固定的,不随其指向的数据类型变化。在使用指针时,要确保正确地初始化和使用,避免未定义行为。
总结,这篇复习资料强调了C语言中动态内存管理的重要性,提供了`malloc()`、`free()`和`realloc()`函数的使用方法,以及宏定义和typedef的应用,还有指针的基本操作。这些都是C语言编程中的核心知识点,理解和掌握这些内容对于编写高效、安全的C程序至关重要。