1、栈区(stack):由编译器自动分配释放,存放函数的参数值,局部变量值等。
2、堆区(heap):一般由程序员分配释放,随叫随到,挥之即走。
3、全局/静态区(static):全局变量和静态变量的存储是放在一起的,在程序编译时分配。
4、文字常量区:存放常量字符串。
5、程序代码区:存放函数体(包括类的成员函数、全局函数)的二进制代码。
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
int oldMan = 58; //全局变量
//1.栈的内存
void say_hello(const char* msg) { //函数的参数和局部变量存放在栈区
if (msg) {
printf("Hello,%s!\n",msg);
}
else {
printf("Hello,who are you?\n");
}
printf("老爷子今年 %d 岁!\n", oldMan);
}
//2.静态变量
void house1(int girl1) {
static int girl = 18;
if (girl == 18) {
girl = 19;
}
else {
girl = 17;
}
printf("女孩今年%d岁!\n",girl);
}
int main() {
//1.栈的内存
say_hello(NULL);
say_hello("world");
//2.堆,动态内存分配
int* salary = NULL;
salary = new int; //在堆区分配动态内存,分配一个
*salary = 100;
printf("salary:%d\n",*salary);
delete salary; //释放内存,长期不释放会导致内存泄漏
int num = 0;
printf("请输入需要雇佣的农民数量:\n");
scanf_s("%d",&num);
if (num <= 0) {
printf("请输入一个大于0的数!");
exit(1);
}
salary = new int[num];//在堆区分配动态内存,分配多个
for (int i = 0; i < num; i++) {
*(salary + i) = i + 1;
}
for (int i = 0; i < num; i++) {
printf("第%d个农民的薪资:%d\n",i+1,salary[i]);
}
printf("--over--\n");
delete[] salary;
//切记,delete 后的动态内存,禁止访问
/*for (int i = 0; i < num; i++) {
printf("第%d个农民的薪资:%d\n", i + 1, salary[i]);
}*/
//3.全局变量/静态变量
printf("老爷子今年%d岁!\n",oldMan);
house1(0);
house1(0);//第二次调用时girl的值不会被重新赋值为18
system("pause");
return 0;
}