飞奔的炮台 发表于 2021-12-25 22:33:27

关于内存栈区的初始理解

内存分配为三块:
静态存储区:主要存放static静态变量、全局变量、常量。内存在编译的时候就给这些数据分配好了内存,生命周期是整个程序从运行到结束。
栈区:存放局部变量。在执行参数的时候(包括main这样的函数),函数内部的局部变量以及传的参数会在栈上创建,函数执行完内存自动释放,生命周期是从该函数内部的开始执行到结束。
堆区:这是属于程序员自己申请的一块任意大小的内存-也叫作动态内存分配。这块内存会一直存在直到程序员释放掉。C语言中,用malloc/new动态地申请内存,用free/delete释放内存。还有realloc,ralloc函数,良好习惯,若申请的动态内存不再使用,要及时释放掉,否则会造成内存泄漏。


函数传参的过程中插入一个元素的动作叫做压栈;​
任何一次函数调用都会在栈区上申请一块空间;参数入栈方向必须由栈顶到栈底,上压下,所以叫做压栈。
删除一个元素叫作出栈:必须由栈顶开始慢慢删,所以传址的优势就在这里。先进去的后出,后进去的先出。
举个栗子:
int main()
{
int a=10;
int arr={1,2,3};//数组
return 0;
}

可见,在栈中是由高地址到低地址分配的。
数组在栈中被当做一个变量整体,但是在数组内部地址随着下标的增长由低到高分配,所以,为什么指针指向一个数组首元素地址就能找到整个数组所有元素的原因。
一旦,数组访问越界,可能a就会被改变,所以,养成优先定义数组的好习惯。
如下:
int main()
{
int arr={1,2,3};
int a=10;
return 0;
}
下面展开一张老师上课的截图:





https://blog.51cto.com/u_15468432/4843465
页: [1]
查看完整版本: 关于内存栈区的初始理解