栈: 由程序自动分配和释放,非全局变量或静态变量,以及非malloc申请的空间,都在栈中。
堆: 由程序员申请的内存空间: malloc, 在堆中申请的内存需要自己释放,malloc与free成对
全局区: 全局变量和静态变量,里面又分为初始化区和未初始化区
文字常量区: 字符常量
程序代码区: 代码
//main.cpp
int a = 0; a 全局初始化区
char *p1; p1 全局未初始化区
main()
{
int b; 栈
char s[] = "abc"; 栈, 此处的“abc”不存在与文字常量区,它是赋值到数组的那块内存中,此值可改,并非字符常量
char *p2; 栈
char *p3 = "123456"; 123456\0在常量区,p3在栈上。
static int c = 0; 全局(静态)初始化区
p1 = (char *)malloc(10);
p2 = (char *)malloc(20);
分配得来得10和20字节的区域就在堆区。
strcpy(p1, "123456"); 123456\0放在常量区,编译器可能会将它与p3所指向的"123456"
优化成一个地方。
}
函数调用如何压栈
函数返回执行的下一个地址先入栈 // 函数调用完后知道下一步该执行什么
参数,一般从右往左入栈,但这个取决于编译器,不一定由右到左, 参数入栈如果为非引用,就是copy值到新的内存空间,然后入栈
自动变量。
函数执行完毕,先将值返回(return),然后局部变量出栈,参数出栈,下一个执行地址出栈。 出栈即内存回收,因此,局部变量自动消失,copy的那份参数也消失。后续会写篇关于到值传递和地址传递。