程序的内存四区模型

程序的内存四区模型


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:本文非本人原创,是听传智的课的课堂笔记。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值