malloc函数

函数名 void * malloc(size_t size)
所在文件 stdlib.h
功能 申请堆内存并返回,申请的空间并未初始化
参数 size_t size表示要申请的长度
返回值 成功:返回申请的空间
失败:返回NULL

示例程序:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. int main()
  5. {
  6. /*
  7. * malloc
  8. * 第一个参数: 需要申请多少个字节空间
  9. * 返回值类型: void *
  10. */
  11. int *p = (int *)malloc(sizeof(int));
  12. printf("p = %i\n", *p); // 保存垃圾数据
  13. /*
  14. * 第一个参数: 需要初始化的内存地址
  15. * 第二个初始: 需要初始化的值
  16. * 第三个参数: 需要初始化对少个字节
  17. */
  18. memset(p, 0, sizeof(int)); // 对申请的内存空间进行初始化
  19. printf("p = %i\n", *p); // 初始化为0
  20. return 0;
  21. }

free函数

函数名 void free(void *p)
所在文件 stdlib.h
功能 释放申请的内存
参数 void *p指向申请的内存
返回值

注意:通过malloc申请的堆内存必须释放,所以malloc与free总是成对出现
示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    // 1.申请4个字节存储空间
    int *p = (int *)malloc(sizeof(int));
    // 2.初始化4个字节存储空间为0
    memset(p, 0, sizeof(int));
    // 3.释放申请的存储空间
    free(p);
    return 0;
}

calloc函数

函数名 void *calloc(size_t nmemb,size_t size)
所在文件 stdlib.h
功能 申请堆内存并返回,所申请空间自动清零
参数 size_t nmemb所需单元数
size_t size单元大小
返回值 成功:返回指向申请空间的指针
失败:返回NULL

示例程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
    /*
    // 1.申请3块4个字节存储空间
    int *p = (int *)malloc(sizeof(int) * 3);
    // 2.使用申请好的3块存储空间
    p[0] = 1;
    p[1] = 3;
    p[2] = 5;
    printf("p[0] = %i\n", p[0]);
    printf("p[1] = %i\n", p[1]);
    printf("p[2] = %i\n", p[2]);
    // 3.释放空间
    free(p);
    */

    // 1.申请3块4个字节存储空间
    int *p = calloc(3, sizeof(int));
    // 2.使用申请好的3块存储空间
    p[0] = 1;
    p[1] = 3;
    p[2] = 5;
    printf("p[0] = %i\n", p[0]);
    printf("p[1] = %i\n", p[1]);
    printf("p[2] = %i\n", p[2]);
    // 3.释放空间
    free(p);

    return 0;
}

realloc函数

函数名 void realloc(void ptr,size_t size)
所在文件 stdlib.h
功能 扩容或缩小原有的堆内存,通常用于扩容
参数 void *ptr表示待扩容的指针
size_t size表示扩容或缩小后的内存大小
返回值 成功:返回指针指向申请的空间
失败:NULL

注意:
1)若ptr==NULL,则等同于使用malloc函数;
2)返回的指针可能与ptr相同也可能不同,取决于后续空间是否够用