麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > C > 正文

淺析C/C++變量在內存中的分布

2020-02-24 14:27:31
字體:
來源:轉載
供稿:網友

在書面測試中經常考慮C/C++變量內存中的分布,雖然很簡單,但很容易忘記,本文是武林技術頻道小編帶來的淺析C/C++變量在內存中的分布,一起跟著武林技術頻道小編來了解吧!

先寫一個測試程序:

?

#include <stdio.h>?
#include <malloc.h>?
int g_i = 100;?
int g_j = 200;?
int g_k, g_h;?
int main()?
{?
??? const int MAXN = 100;?
??? int *p = (int*)malloc(MAXN * sizeof(int));?
??? static int s_i = 5;?
??? static int s_j = 10;?
??? static int s_k;?
??? static int s_h;?
??? int i = 5;?
??? int j = 10;?
??? int k = 20;?
??? int f, h;?
??? char *pstr1 = "MoreWindows123456789";?
??? char *pstr2 = "MoreWindows123456789";?
??? char *pstr3 = "Hello";?

?????
??? printf("堆中數據地址:0x%08x/n", p);?

??? putchar('/n');?
??? printf("棧中數據地址(有初值):0x%08x = %d/n", &i, i);?
??? printf("棧中數據地址(有初值):0x%08x = %d/n", &j, j);?
??? printf("棧中數據地址(有初值):0x%08x = %d/n", &k, k);?
??? printf("棧中數據地址(無初值):0x%08x = %d/n", &f, f);?
??? printf("棧中數據地址(無初值):0x%08x = %d/n", &h, h);?

??? putchar('/n');?
??? printf("靜態數據地址(有初值):0x%08x = %d/n", &s_i, s_i);?
??? printf("靜態數據地址(有初值):0x%08x = %d/n", &s_j, s_j);?
??? printf("靜態數據地址(無初值):0x%08x = %d/n", &s_k, s_k);?
??? printf("靜態數據地址(無初值):0x%08x = %d/n", &s_h, s_h);?

??? putchar('/n');?
??? printf("全局數據地址(有初值):0x%08x = %d/n", &g_i, g_i);?
??? printf("全局數據地址(有初值):0x%08x = %d/n", &g_j, g_j);?
??? printf("全局數據地址(無初值):0x%08x = %d/n", &g_k, g_k);?
??? printf("全局數據地址(無初值):0x%08x = %d/n", &g_h, g_h);?

??? putchar('/n');?
??? printf("字符串常量數據地址:0x%08x 指向 0x%08x 內容為-%s/n", &pstr1, pstr1, pstr1);?
??? printf("字符串常量數據地址:0x%08x 指向 0x%08x 內容為-%s/n", &pstr2, pstr2, pstr2);?
??? printf("字符串常量數據地址:0x%08x 指向 0x%08x 內容為-%s/n", &pstr3, pstr3, pstr3);?
??? free(p);?
??? return 0;?
}?


運行結果(Release版本,XP系統)如下:

?

可以看出:
1. 變量在內存地址的分布為:堆-棧-代碼區-全局靜態-常量數據
2. 同一區域的各變量按聲明的順序在內存的中依次由低到高分配空間(只有未賦值的全局變量是個例外)
3. 全局變量和靜態變量如果不賦值,默認為0。 棧中的變量如果不賦值,則是一個隨機的數據。
4. 編譯器會認為全局變量和靜態變量是等同的,已初始化的全局變量和靜態變量分配在一起,未初始化的全局變量和靜態變量分配在另一起。

上面程序全在一個主函數中,下面增加函數調用,看看函數的參數和函數中變量會分配在什么地方。

程序如下:

?

#include <stdio.h>?
void fun(int i)?
{?
??? int j = i;?
??? static int s_i = 100;?
??? static int s_j;?

??? printf("子函數的參數:??????? 0x%p = %d/n", &i, i);?
??? printf("子函數 棧中數據地址: 0x%p = %d/n", &j, j);?
??? printf("子函數 靜態數據地址(有初值): 0x%p = %d/n", &s_i, s_i);?
??? printf("子函數 靜態數據地址(無初值): 0x%p = %d/n", &s_j, s_j);?
}?
int main()?
{?
??? int i = 5;?
??? static int s_i = 100;?
??? static int s_j;?

??? printf("主函數 棧中數據地址: 0x%p = %d/n", &i, i);?
??? printf("主函數 靜態數據地址(有初值): 0x%p = %d/n", &s_i, s_i);?
??? printf("子函數 靜態數據地址(無初值): 0x%p = %d/n", &s_j, s_j);?
??? putchar('/n');?

??? fun(i);?
??? return 0;?
}?


運行結果如下:

?

可以看出,主函數中棧的地址都要高于子函數中參數及棧地址,證明了棧的伸展方向是由高地址向低地址擴展的。主函數和子函數中靜態數據的地址也是相鄰的,說明程序會將已初始化的全局變量和靜態變量分配在一起,未初始化的全局變量和靜態變量分配在一起。

以上就是關于淺析C/C++變量在內存中的分布,你學會了嗎?如果你還想了解更多的專業程序知識,建議你來武林技術頻道進行學習吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: av免费av| 一本色道久久99精品综合蜜臀 | 看毛片电影| 国产精品久久久久久久午夜片 | 久久艹精品| 国产亚洲精久久久久久蜜臀 | 国产超碰人人做人人爱ⅴa 国产精品久久久久久久hd | 国产一区二区三区手机在线 | 国产精品久久久久久模特 | 黄色免费不卡视频 | www.99tv| 91麻豆精品国产91久久久无需广告 | 黄网站在线免费 | 国产精品99久久久久久久vr | 黄色片视频观看 | 久久久久久久久久美女 | 久草在线视频看看 | 欧美性黄 | 欧美精品一二三区 | 福利在线免费视频 | 久久色网站 | 激情视频免费看 | 国产一区二区二 | 亚洲第一精品在线 | www国产成人免费观看视频,深夜成人网 | 3xxx| 91av在线免费观看 | 色网免费观看 | 中文字幕四区 | 黄色片网站在线免费观看 | 超级av在线| 夜夜看 | 91精品国产日韩91久久久久久360 | 国产精品视频yy9299一区 | 96视频在线免费观看 | 91婷婷射| 久久骚| 国产一级毛片高清视频完整版 | 极品美女一级毛片 | gril hd| aa国产视频一区二区 |