1. 常用函数

这些函数在stdlib.h头文件中

1.1 malloc()

作用:申请一片连续的空间,返回的是这片空间的首地址

使用:

1
malloc(size_t_Size)

示例:

1
2
3
4
5
6
7
8
9
10
11
int* p = malloc(100 * sizeof(int)); //申请一片空间存储100个int类型的整数,这种写法比较聪明

//申请完之后记得进行赋值
//第1种方式
for (int i = 0; i < 10; i++){
*(p + i) = (i + 1)*10;
}
//第2种方式
for (int i = 0; i < 10; i++){
p[i] = (i + 1) * 10; //p[i] 相当于 *(p + i)
}

1.2 calloc()

作用:申请空间+数据初始化

使用

1
calloc(size_t_Count,size_t_Size)

示例:

1
int* p = calloc(10, sizeof(int));

1.3 realloc()

作用:修改空间大小

使用:

1
realloc(指针,size_t_Size)

示例:

1
2
int* p = malloc(100 * sizeof(int));
int* pp = realloc(p, 20*sizeof(int));

1.4 free()

作用:释放空间

示例:

1
2
3
int* p = malloc(100 * sizeof(int));
int* pp = realloc(p, 20*sizeof(int));
free(pp)

申请的空间不用了,一定要记得释放

2. 常用函数的细节点

2.1 malloc

  • malloc()创建空间的单位是字节

  • malloc()返回的是void类型的指针,没有步长的概念,也无法获取空间中的数据,需要强转

    具体方法:int* p = (int*)malloc(size)

    实际上不强转也行,前面用int,C语言底层会帮进行类型转换

  • malloc()返回的仅仅是首地址,没有总大小,最好定义一个变量记录总大小;申请失败返回NULL

  • malloc申请的空间不会自动消失,如果不能正确释放,会导致内存泄露

  • malloc申请的空间过多,会产生虚拟内存,赋值了才会变成真的

  • malloc申请的空间没有初始化值,需要先赋值才能使用

2.2 其他三个函数

  • free释放完空间之后,空间中的数据叫做脏数据,可能被清空,可能被修改为其他数据

  • calloc就是在malloc的基础上多一个初始化的动作

  • realloc修改之后的空间,地址值有可能发生变化,也有可能不会改变,但是原本的数据不会丢失,如果内存中已经无法申请空间了,会返回NULL

  • realloc修改之后,无需释放原来的空间,函数底层会进行处理

3.C语言的内存结构

  • 指针加双引号定义的字符串放在常量区