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;
}

posted on 2022-10-14 16:54  wshidaboss  阅读(23)  评论(0编辑  收藏  举报