1.10内存四区(全局区)

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#pragma warning(disable:4996)
/*
内存四区
    代码区code:操作系统管理                        --内部rom
    全局区global:静态变量、文字常量和全局变量      --内部rom
    栈区stack:程序局部变量                            --系统分配空间,自动回收
    堆区heap:maoolc、free、delete                    --程序员手动释放 

程序流程说明:
1.操作系统把物理硬盘代码load到内存
2.操作系统把c代码分成4个区
*/
    
char *get_str1(){
    char *a = "abce";//"abce"文字常量区  ,a 栈区
    printf("get_str1:a=%p,&a = %p\n",a,&a);
    return a;
}
char *get_str2(){
    char *b = "abce";//"abce"文字常量区  ,b 栈区
    printf("get_str2:b=%p,&b = %p\n", b, &b);
    return b;
}

int main(void){
    char *p = NULL; //p 栈区
    char *q = NULL;// p  栈区
    p = get_str1();//该函数作用:将p指向 get_str1 返回的地址
    q = get_str2();
    printf("p = %p, p = %s\n", p, p);//两者指向相同的地址,因为是同一个文字常量区
    printf("q = %p, q = %s\n", q, q); 

    printf("\n");
    system("pause");
    return 0;
}


内存分析

【注:自己从老师讲解出理解的,不对的地方望指正】

【注:本程序验证是使用vs2013版】

前奏1:将代码放置代码区

前奏2:将全局变量找出来,放在全局区,相同的全局变量只放置1次,并记录该变量地址;

    abce作为文字常量,存放在全局区内,且地址是:003A5858,

程序执行1:在栈区创建p,q两个指针变量

程序执行2:在栈区给 get_str1() 分配空间  

程序执行3:在 get_str1() 的栈区空间内创建 a指针变量,并将变量的值存储为 003A5858

程序执行4:打印出:指针变量指向的地址是(全局变量a的地址 和   指针变量本身的地址是0021F7F8,

扫描二维码关注公众号,回复: 6575099 查看本文章

程序执行5:get_str1() 执行完毕,将 a 的值返回,传递给p,并回收此处栈空间(此时p的值变为了 003A5858

程序执行6: get_str2()跟 get_str1()相同的步奏,不在重复。

...

程序执行7:打印出指针变量的指向地址  和  指针变量指向的内容

猜你喜欢

转载自www.cnblogs.com/wlstm/p/11071703.html