程式的記憶體四區模型

annjeff發表於2019-01-23

程式的記憶體四區模型


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:本文非本人原創,是聽傳智的課的課堂筆記。

 

 

相關文章