程序的内存四区模型
1.程序运行的流程
a.操作系统把物理硬盘代码Load到内存中
b.操作系统把C代码分成四个区
c.操作系统找到main函数入口执行
2.全局区分析
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char *get_str()
{
char *p = "abcde"; //文字常量区
printf("g_p = %d\n",p); // g_p = 13400880
return p;
}
char *get_str2()
{
char *q = "abcde"; //文字常量区
printf("g_q = %d\n", q); //
return q;
}
int main()
{
char *p = NULL;
char *q = NULL;
p = get_str();
// %s :指针指向内存区域的内容
// %d :打印p本身的值
printf("p =%s\n", p); //p指针指向内存区域的内容 p = "abcde"
printf("p=%d\n", p); //p指针指向的地址 p = 12300880
printf("&p=%d\n", &p); //p指针指向的地址 &p=5241348
q = get_str2();
printf("q =%s\n", q); //p指针指向内存区域的内容 p = "abcde"
printf("q=%d\n", q); //p指针指向的地址 p = 12300880
printf("&q=%d\n", &q); //p指针指向的地址 &q=5241336
system("pause");
return 0;
}
3.栈区分析
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
char* get_str()
{
char str[] = "annjeff";
return str;
}
int main()
{
char buf[128] = { 0 };
strcpy(buf, get_str());
/**
* Q:此处打印出来的结果是什么?
* 答案可能是原来内容也可能是乱码
* 如果先拷贝后释放,结果就是原来的内容,需要看编译器
*/
printf("buf = %s\n", buf);
/**
* Q:此处打印出来的结果是什么?
* 答案是乱码
* 因为,str分配在栈区,函数运行结束,释放空间
* 此时p指向的是已释放的空间,故而乱码
*/
char *p = NULL;
p = get_str();
printf("p = %s\n", p);
printf("\n");
system("pause");
return 0;
}
栈区地址的生长方向:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
int main(void)
{
int a;
int b;
char buf[4];
printf("&a: %p\n", &a);
printf("&b: %p\n", &b);
printf("buf的地址 : %p\n", &buf[0]);
printf("buf+1地址: %p \n", &buf[1]);
system("pause");
return 0;
}
&a: 000000C6276FF654
&b: 000000C6276FF674
buf的地址 : 000000C6276FF694
buf+1地址: 000000C6276FF695
4.堆区分析
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//堆区测试
char* get_str2()
{
char *temp = (char*)malloc(10);
if (temp == NULL)
{
return NULL;
}
strcpy(temp, "annjeff");
return temp;
}
int main()
{
//堆区测试
char *q = get_str2();
if (q != NULL)
{
printf("q = %s",q);
//Note:
// free释放,仅仅告诉操作系统这片区域可以让他人使用,里面内容在没被覆盖以前依旧存在
free(q);
q = NULL;
}
printf("\n");
system("pause");
return 0;
}
Note:本文非本人原创,是听传智的课的课堂笔记。