「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」
快速排序
-
代码
-
结果
动态内存管理
-
更灵活的内存管理方式
-
库函数
- malloc:申请动态内存空间
- free:释放动态内存空间
- calloc:申请并初始化一系列内存空间
- realloc:重新分配内存空间
-
malloc
- 函数原型:void *malloc(size_t size);
- malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针(void类型,因为void类型可以转换为任何类型),且申请的空间不会初始化为0,而是随机的。
- 如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针(void *),所以他可以转换成任何类型的数据;如果函数调用失败,返回值是NULL。另外,如果size参数设置为0,返回值也可能是NULL,但这并不意味着函数调用失败。
-
举例
- 代码
- 结果
- 代码
- malloc还可以申请一块任意尺寸的内存空间
-
举例
- 代码
- 结果
- 代码
-
初始化内存空间
-
以mem开头的函数被编入字符串标准库,函数的什么包含在string.h这个头文件中:
-
memset:使用一个常量字节填充内存空间
-
举例
- 代码
- 结果
- 代码
- 注意:memset是按字节赋值的,取后8位二进制进行赋值。1的二进制是(00000000 00000000 00000000 00000001),取后8位(00000001),int型占4个字节,当初始化为1时,它把一个int的每个字节都设置为1,也就是0x01010101,二进制是00000001 00000001 00000001 00000001,十进制就是16843009。
-
- memcpy:拷贝内存空间
- memmove:拷贝内存空间
- memcmp:比较内存空间
- memchr:在内存空间中搜索一个字符
-
-
- 注:使用该函数分配内存空间是存放在堆上的,使用结束需要手动释放\
-
free
- 函数原型:void free(void *ptr);
- free函数释放ptr参数指向的内存空间。该内存空间必须是由malloc、calloc或realloc函数申请的。否则,该函数导致未定义行为。如果ptr参数是NULL,则不执行任何操作。
- 注意:该函数并不会修改ptr参数的值,所以调用后它仍然指向原来的地方(变为非法空间,指向的是已经释放的不存在的空间)。
- 举例
- 结果
-
内存泄漏
-
导致内存泄漏主要有两种情况
-
隐式内存泄漏(即用完内存块没有及时使用free函数释放)
- 大量申请无用内存
-
丢失内存块的地址
- 举例
- 结果
- 举例
-
-
-
calloc\
- 函数原型:void *calloc(size_t nmemb,size_t size);
- calloc函数在内存中动态地申请nmemb个长度为size的连续内存空间(即申请的总空间尺寸为nmemb*size),这些内存空间全部被初始化为0;
- 下列两种写法等价
-
realloc
- 函数原型:void *realloc(void *ptr,size_t size);
-
注意:
- realloc函数修改ptr指向的内存空间大小为size字节
- 如果新分配的内存空间比原来的大,则旧内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失。
- 该函数将移动内存空间的数据并返回新的指针
- 如果ptr的参数为NULL,那么调用该函数就相当于调用malloc(size);
- 如果size参数为0,并且ptr参数不为NULL,那么调用该函数相当于调用free(ptr);
- 除非ptr参数为NULL,否则ptr的值必须由先前调用malloc、calloc或realloc函数返回
- 举例
- 结果
-