内存函数主要有以下几方面作用:
* **内存分配**
* **`malloc`** :`malloc` 是 “memory allocation” 的缩写,用于在程序运行过程中动态分配指定大小的内存块。例如:`int *ptr = (int*)malloc(sizeof(int) * 10);` 这行代码分配了大小为 40 个字节(假设 `int` 占 4 个字节)的内存空间,用于存储 10 个整数。它返回指向分配内存块的起始地址的指针,如果分配失败,返回空指针。
* **`calloc`** :全称是 “contiguous allocation”,它与 `malloc` 类似,但分配的是连续的多个内存块,并且会自动初始化为零。例如:`int *ptr = (int*)calloc(10, sizeof(int));` 同样分配了存储 10 个整数的内存空间,而且这些内存空间中的值被初始化为 0。
* **`realloc`** :用于重新调整之前已经分配内存的块的大小。当已经分配的内存空间不够用或者想要调整大小时,可以使用这个函数。例如:`ptr = (int*)realloc(ptr, sizeof(int)*20);` 将之前分配的内存空间大小调整为 20 个整数的大小。如果调整成功,返回新的内存块的起始地址;如果失败,返回空指针,但原来的内存块仍然有效。
* **内存释放**
* **`free`** :当动态分配的内存不再使用时,必须使用 `free` 函数释放内存空间,以便让系统可以重新管理这些内存,避免内存泄漏。例如:`free(ptr);` 释放指针 `ptr` 指向的内存块,释放后,指针本身仍然存在,但其指向的内存被系统回收,此时不应该再访问该指针指向的内存。
* **内存操作**
* **`memcpy`** :用于将一块内存中的内容复制到另一块内存中。例如:`memcpy(dest, src, n);` 将 `src` 指向的内存块中的前 `n` 个字节复制到 `dest` 指向的内存块中。要求源内存块和目标内存块不能重叠,否则可能会出现未定义的行为。
* **`memmove`** :与 `memcpy` 功能相似,但允许源内存块和目标内存块重叠。它在处理重叠内存复制时更加安全可靠。
* **`memset`** :用于将指定内存块中的每个字节设置为指定的值(取值范围是 0 - 255)。例如:`memset(buffer, 0, sizeof(buffer));` 将数组 `buffer` 中的所有字节都设置为 0,常用于内存初始化为全零的情况。 |