一、操作系统是如何执行exe程序的?
1、操作系统首先把物理磁盘代码load到内存;
2、操作系统把C代码分成四分区;
3、操作系统找到main函数入口执行
二、内存四区
1、栈区:局部变量存放的位置,因为局部变量出了作用域会被析构释放空间,所以也叫临时区;
2、堆区:需要手动分配和释放内存的区,由malloc和new分配,free和delete释放;
3、全局区:全局变量,静态变量,常量存放的位置,相同的常量在该区只会保存一份,全局区归操作系统管理;
4、代码区:顾名思义,存放代码的。
三、示例
#include"stdio.h"
#include"stdlib.h"
#include"string.h"
char* getval1() {
char* p1 = "abcdefg";
return p1;
}
char* getval2() {
char* p2 = "abcdefg";
return p2;
}
int main() {
char* p1 = NULL;
char* p2 = NULL;
p1 = getval1();
p2 = getval2();
printf("*p1 : %s, *p2 : %s\n", p1, p2);
printf("p1 : %d, p2 : %d\n", p1, p2);
system("pause");
return 0;
}
输出结果:
可以发现main函数中的p1和p2指向同一个地址,这里画图解释一下:
首先main函数两个指针变量压栈,调用getval1函数,getval1函数中的局部变量p1压栈,此时指向了常量“abcdefg”,常量是放在全局区的,函数返回后p1这个变量被析构了,但他指向的全局区的首地址还是存在的,所以main函数中的p1也指向了全局区的“abcdefg”的首地址。此时getval1函数弹栈:
调用getval2函数的时候,getval2函数压栈,getval2函数中的p2指向的常量仍然是“abcdefg”,编译器会进行优化,在全局区只保留一个“abcdefg”, 所以getval2函数中的p2同样指向4287280这个地址,getval2函数返回后,p2被析构掉了,但其指向的地址还在,所以main函数中的p2也指向了4287280这个地址,最后main函数中的p1和p2指向的地址是一样的。
四、字面值
对于
int j = 0;
这个0是存放在哪里的呢,因为0是不能取地址的,所以不能放在栈区,堆区和全局区,一般认为是放在代码区的。