猛戳订阅 详解数据结构专栏 深度解析
订阅
以下专栏。国外最有名的被称为程序员的知乎
的网站就叫做Stack Overflow哦
1.在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。
2.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。
3.栈区主要存放运行函数而分配的局部变量、函数参数、返回数据、返回地址等。
原则
是谁开辟的空间谁来释放
1.一般由程序员分配释放, 若程序员不释放,程序结束时可能由(操作系统)OS
回收 。分配方式类似于链表。
3.一般必须由程序员来free释放掉
,否则造成内存泄漏很严重,C/C++编译器检查不出来内存泄漏,如果你以后在工作时没有自行free释放掉你自己开辟的空间。年终奖就没了哦(大厂差不多几万元)
全局变量、静态数据。程序结束后由系统释放
。普通的局部变量
是在栈区分配空间的,栈区的特点是在上面创建的变量出了作用域就销毁
。上面创建的变量,直到程序结束才销毁所以生命周期变长。
我们已经掌握的内存开辟方式有:
int val = 20;//在栈空间上开辟四个字节
char arr[10] = {0};//在栈空间上开辟10个字节的连续空间
大小
是固定的
。必须指定数组的长度
,它所需要的内存在编译时分配。所以这时候动态内存就横空出世
了
❄️小技巧(tip):关于查函数的用法、原型、返回值。可以上这个网站
http://www.cplusplus.com/
❄️函数功能:
连续可用的空间
,并返回
指向这块空间的指针
。❄️函数原型
void* malloc (size_t size);
注意点:
成功
,则返回一个指向开辟好空间的指针。失败
,则返回一个NULL指针,因此malloc的返回值一定要做检查。一般的检查如下所示int* p = (int*)malloc(4);
if(p == NULL)
{
return;
}
❄️函数功能:
做动态内存的释放和回收的。
这个函数和malloc等内存函数配套使用
❄️函数原型
voidfree (void*ptr);
注意:
ree函数用来释放动态开辟的内存。
如果参数ptr指向的空间不是动态开辟
的,那free函数的行为是错误的
!。
如果参数ptr是NULL指针,则函数什么事都不做。
malloc和free都声明在 stdlib.h
头文件中
野指针现象。
#include
int main()
{
int* ptr = NULL;
ptr = (int*)malloc(num*sizeof(int));
if(NULL != ptr)//判断ptr指针是否为空
{
int i = 0;
for(i=0; i<num; i++)
{
*(ptr+i) = 0;
}
}
free(ptr);//释放ptr所指向的动态内存
ptr = NULL;//一定要置空。
return 0;
}
❄️函数功能:
并且把空间的每个字节初始化为0
。❄️函数原型
void* calloc (size_t num, size_t size);
注意:
返回地址之前把申请的空间的每个字节初始化为全0。
❄️函数功能:
❄️函数原型
void* realloc (void* ptr, size_t size);
注意:
返回值为调整之后的内存起始位置。
拷贝
到 新 的空间
情况1:
情况2;
返回
的是一个新的内存地址
。绿色的pt
r是新返回的空间刚学会这些函数一般会犯的错误。
错误代码如下。
void test()
{
int *p = (int *)malloc(4);
*p = 20;//如果p的值是NULL,就会有问题
free(p);
}
正确做法是先判断p指针是否为空
,解决方案如下。
错误代码
相当于数组越界
了
void test()
{
int i = 0;
int *p = (int *)malloc(10*sizeof(int));
if(NULL == p)
{
exit(EXIT_FAILURE);
}
for(i=0; i<=10; i++)
{
*(p+i) = i;//当i是10的时候越界访问
}
free(p);
}
错误代码
void test()
{
int a = 10;
int *p = &a;
free(p);//ok?
}
原则:我们一定要坚守底线——谁开辟的空间谁来释放
谁犯的错谁来承担责任
解析:
错误代码
void test()
{
int *p = (int *)malloc(100);
p++;
free(p);//p不再指向动态内存的起始位置
}
注意:
错误代码
void test()
{
int *p = (int *)malloc(100);
if(NULL != p)
{
*p = 20;
}
}
int main()
{
test();
while(1);
}
注意:
最可怕
的。C 程序员交友社区
一个人可以走得很快,但一群人才能走得更远!