零基础C语言:第十五讲(快速排序、动态内存管理)

157 阅读3分钟

「这是我参与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函数返回
      • 举例
      • 结果