#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,
程序执行5:get_str1() 执行完毕,将 a 的值返回,传递给p,并回收此处栈空间(此时p的值变为了 003A5858)
程序执行6: get_str2()跟 get_str1()相同的步奏,不在重复。
...
程序执行7:打印出指针变量的指向地址 和 指针变量指向的内容