当前位置:网站首页>4.30动态内存分配笔记
4.30动态内存分配笔记
2022-07-06 09:19:00 【犇犇犇犇犇犇】
为什么存在内存分配
int a=10;//局部变量
int g_a=10;//全局变量
1.创建一个变量时会申请内存
内存分为一个大的区域
栈区
堆区
静态区
栈区存放局部变量,函数的形式参数等
堆区存放动态内存分配的空间
静态区存放全局变量,静态变量等
2.创建一个数组可以是局部变量也可以是全局变量
int arr[10];
但是这样创建数组的内存我们必须首先给出数组的长度,C语言是不可以创建变长数组的(C99的编译器可以)int arr[n];所以像这样在某些时候我们就不好申请内存,比如在存储一个班级学生的信息时,学生人数难免会有变动这是就会产生空间的浪费或者空间申请不够的情况,这时我们就需要动态内存分配。
malloc
void* malloc (size_t size);
int* p=(int*)malloc(sizeof(int));
if(p==NULL)
{
printf("%s\n",strerror(errno));
}
else
{
int i=0;
for(i=;i<10;i++)
{
*(p+i)=i;
}
for(i=0;i<10;i++)
{
printf("%d",*(p+i));
}
}
free(p);
这就是malloc函数的格式 void*是一种指针类型,当你申请好内存空间就把首地址传给你。但是malloc是会开辟失败的,比如当你只有4G的内存但是你要申请8G的内存这是就会申请失败,申请失败会返回一个空指针,所以我们就要对它进行处理。
free
当你malloc申请成功,然后不在使用这些空间时你就需要释放空间,把空间还给操作系统,free这个函数就是这个作用。这个在大工程中特别重要否则会造成内存泄漏,但是在平常练习中如果没有不会有什么影响,因为在进程结束时操作系统会自动收回空间。当你把某指针的内存释放后记得把该指针置NULL,不然该指针其实还可以找到那片空间。
*free只作用动态开辟出来的内存
calloc
void* calloc (size_t num, size_t size);
该函数跟malloc作用一样,只不过它在开辟空间时把申请的空间每个字节赋值为零了(初始化为零)。并且格式表达上有些细微的差别,一个是直接算出总元素的内存,一个是算出有几个元素每个元素多大。
realloc
p=(int*)realloc(p,40);//40之前的p代表原空间的地址
realloc可以调整动态内存的大小,当你malloc申请的内存不够时你可以使用realloc来调整动态开辟的内存,当你用同一个指针来realloc调整内存时这是要注意。当你malloc后续空间不够你realloc申请调整的大小时会在其它地方重新开辟一个空间再把全有数据拷贝过来,这时返回的地址和原来的空间的地址可能不一样,原地址会被废掉,而且当realloc开辟失败时,返回空,原地址也会被废掉,所以得用一个新的变量来接受realloc函数的返回值。
realloc使用注意事项:
1.如果p指向的空间之后有足够的内存空间可以追加,则直接追加,后返回p
2.如果p指向的空间之后没有足够的内存空间可以追加,则realloc函数会重新找一个新的内容区域,开辟一块满足需求的空间,并且把原来的内存中的数据拷贝过来,释放旧的内存空间,最后返回新开辟内存空间地址。
边栏推荐
- The earth revolves around the sun
- [algorithm] sword finger offer2 golang interview question 2: binary addition
- Wechat applet development experience
- 架构师怎样绘制系统架构蓝图?
- Shortest Hamilton path (pressure DP)
- 【rtklib】在rtk下使用抗差自适应卡尔曼滤波初步实践
- 最短Hamilton路径 (状压DP)
- [算法] 剑指offer2 golang 面试题7:数组中和为0的3个数字
- 【RTKLIB 2.4.3 b34 】版本更新简介一
- 【无标题】
猜你喜欢

阿里云微服务(一)服务注册中心Nacos以及REST Template和Feign Client

抽象类和接口

FairyGUI循環列錶

几道高频的JVM面试题

系统设计学习(二)Design a key-value cache to save the results of the most recent web server queries

闇の連鎖(LCA+树上差分)

341. Flatten nested list iterator

如何保障 MySQL 和 Redis 的数据一致性?
![[algorithm] sword finger offer2 golang interview question 10: subarray with sum K](/img/63/7422489d09a64ec9f0e79378761bf1.png)
[algorithm] sword finger offer2 golang interview question 10: subarray with sum K

FairyGUI条子家族(滚动条,滑动条,进度条)
随机推荐
121道分布式面试题和答案
MySQL shutdown is slow
[算法] 剑指offer2 golang 面试题3:前n个数字二进制形式中1的个数
On March 15, the official version of go 1.18 was released to learn about the latest features and usage
The port is occupied because the service is not shut down normally
GNSS positioning accuracy index calculation
Fairygui gain buff value change display
Novatel board oem617d configuration step record
Code example of MATLAB reading GNSS observation value o file
[算法] 剑指offer2 golang 面试题12:左右两边子数组的和相等
MySQL 三万字精华总结 + 面试100 问,吊打面试官绰绰有余(收藏系列
[Chongqing Guangdong education] Shandong University College Physics reference materials
Mixed use of fairygui button dynamics
阿里云微服务(二) 分布式服务配置中心以及Nacos的使用场景及实现介绍
MySQL backup -- common errors in xtrabackup backup
[GNSS] robust estimation (robust estimation) principle and program implementation
Matlab读取GNSS 观测值o文件代码示例
错误:排序与角标越界
[rtklib] preliminary practice of using robust adaptive Kalman filter under RTK
IText 7 generate PDF summary