程式的記憶體四區模型
程式的記憶體四區模型
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:本文非本人原創,是聽傳智的課的課堂筆記。
相關文章
- 程式的記憶體模型記憶體模型
- Java記憶體區域和記憶體模型Java記憶體模型
- Akka系列(四):Akka中的共享記憶體模型記憶體模型
- Akka 系列(四):Akka 中的共享記憶體模型記憶體模型
- 記憶體四區之程式碼區,全域性區,棧區和堆區記憶體
- 你瞭解Java記憶體模型麼(Java7、8、9記憶體模型的區別)Java記憶體模型
- (四) 一文搞懂 JMM - 記憶體模型記憶體模型
- Java記憶體區域(執行時資料區域)和記憶體模型(JMM)Java記憶體模型
- 記憶體模型記憶體模型
- Java的記憶體模型Java記憶體模型
- 聊聊 記憶體模型與記憶體序記憶體模型
- Java記憶體模型FAQ(一) 什麼是記憶體模型Java記憶體模型
- Java 記憶體模型Java記憶體模型
- Java記憶體模型Java記憶體模型
- ffmpeg記憶體模型記憶體模型
- JVM記憶體模型JVM記憶體模型
- Java常見知識點彙總(⑱)——Jvm記憶體結構、Java記憶體模型、Java物件模型的區別JavaJVM記憶體模型物件
- JVM 記憶體模型 記憶體分配,JVM鎖JVM記憶體模型
- 【譯】JavaScript 的記憶體模型JavaScript記憶體模型
- JVM記憶體結構、Java記憶體模型和Java物件模型JVM記憶體Java模型物件
- Java記憶體模型FAQ(五)舊的記憶體模型有什麼問題?Java記憶體模型
- 什麼是Java記憶體模型(JMM)中的主記憶體和本地記憶體?Java記憶體模型
- Java 執行時資料區和記憶體模型Java記憶體模型
- JMM Java 記憶體模型Java記憶體模型
- Java記憶體模型-(1)Java記憶體模型
- JVM-記憶體模型JVM記憶體模型
- JVM記憶體模型(五)JVM記憶體模型
- Java物件記憶體模型Java物件記憶體模型
- 探索Java記憶體模型Java記憶體模型
- 理解Java記憶體模型Java記憶體模型
- hive on spark記憶體模型HiveSpark記憶體模型
- java記憶體模型的實現Java記憶體模型
- Java記憶體模型的基礎Java記憶體模型
- js需要清楚的記憶體模型JS記憶體模型
- 修改後的 OpenJDK 記憶體模型JDK記憶體模型
- C中的記憶體分配模型記憶體模型
- jvm記憶體區JVM記憶體
- JVM的記憶體區域JVM記憶體