动态内存分布
函数名 | 全部单词 | 作用 |
---|---|---|
malloc | memory allocation | 申请空间(连续) |
calloc | contiguous allocation | 申请空间 +数据初始化 |
realloc | re-allocation | 修改空间大小 |
free | free | 释放空间 |
-
malloc创建空间的单位是字节
-
malloc返回的是void类型的指针,没有步长的概念,也无法获取空间中的数据,需要强转,void类型具有通用性
-
malloc返回的仅仅是首地址,没有总大小,最好定义一个变量记录总大小
-
malloc申请的空间不会自动消失,如果不能正确释放,会导致内存泄露
-
malloc申请的空间过多,会产生虚拟内存
虚拟内存: 虚拟:假的
当申请的空间过多,因为每一个内存空间不会在刚申请的时候就立马使用
所以c语言并不会立马就在内存中去开辟空间,而是什么时候存储数据了,才会真正的分配空间
目的:为了提高内存的使用效率
-
malloc申请的空间没有初始化值,需要先赋值才能使用
-
free释放完空间之后,空间中数据叫做脏数据,可能被清空,可能被修改为其他值
-
calloc就是在malloc的基础上多一个初始化的动作
-
realloc修改之后的空间,地址值有可能发生变化,也有可能不会改变,但是原本的数据不会丢失
-
realloc修改之后,无需释放原来的空间,函数底层会进行处理
示例代码
#include<stdio.h> //使用以上函数所需头文件 #include<stdlib.h> int main() { //申请一个连续空间长度为10个int int *p = (int*)malloc(10 * sizeof(int)); //申请一个空间长度为10个int,并且初始化 int *test = (int*)calloc(10,sizeof(int)); int i; //将申请的第一个空间p的长度修改为20个int int *temp = (int*)realloc(p,20 * sizeof(int)); //将p空间更新,p将指向一个新的内存块,而不会丢失之前分配的数据。 p = temp; //对p空间中前10个int进行赋值 for(i=0;i<10;i++) { //下面3行代码效果一致,都是对空间进行赋值 *(p + i) = i+1; //p[i] = i+1; //i[p] = i+1; } //对p空间中第10个int到第20个int进行赋值 for(i=10;i<20;i++) { *(p + i) = i+1; } //遍历空间p中的数据 for(i=0;i<20;i++) { printf("%d ",*(p+i)//p[i]、i[p]); } printf("\n"); //遍历空间test,查看初始化的结果 for(i=0;i<10;i++) { printf("%d ",*(test+i)); } printf("\n"); //释放空间 free(p); return 0; }
c语言的内存结构
提高变量的生命周期:定义在函数外或使用static
常量区的数据不可以修改,且具有复用性
容易混淆的
int *p = "abc";
p = "bbb"; 这并不是修改,而是将p由指向abc换成了指向bbb的指针
*p = “bbb” 这才是修改abc的值,这是不允许的