<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
棧儲存了一個函數呼叫所需的維護資訊
每次函數呼叫都對應著一個棧上的活動記錄
從main() 開始執行
main() 呼叫 f()
當從 f() 呼叫中返回 main()
下面看一個指向棧資料的指標:
#include <stdio.h> int* g() { int a[10] = {0}; return a; } void f() { int i = 0; int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *pointer = g(); for (i = 0; i < 10; i++) { b[i] = pointer[i]; } for(i = 0; i < 10; i++) { printf("%dn", b[i]); } } int main() { f(); return 0; }
輸出結果如下:
如果把
for (i = 0; i < 10; i++)
{
b[i] = pointer[i];
}
註釋了,直接列印 pointer[i] 裡面的資料,如下:
#include <stdio.h> int* g() { int a[10] = {0}; return a; } void f() { int i = 0; int b[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int *pointer = g(); /* for (i = 0; i < 10; i++) { b[i] = pointer[i]; } */ for(i = 0; i < 10; i++) { printf("%dn", pointer[i]); } } int main() { f(); return 0; }
輸出結果如下:
為什麼直接列印 pointer[i] 裡面的值會是這樣呢?因為 pointer 指向的空間是棧空間,棧空間在 g() 函數返回之後,活動記錄就被釋放了。被釋放後呼叫 printf 函數,printf 函數需要在棧上面建立一個活動記錄。這個活動記錄就會有 printf 函數的引數資訊和返回值等,所以 pointer 所指向的記憶體裡面的資料由於 printf 函數的呼叫被改變了。因此,不能返回區域性變數的地址,不能返回區域性陣列的陣列名。
為什麼有了棧還需要堆?
答:棧上的資料在函數返回後就會被釋放掉,無法傳遞到函數外部,如:區域性陣列
C語言程式中通過庫函數的呼叫獲得堆空間
系統對堆空間的管理方式
空閒連結串列法,點陣圖法,物件池法等等
以 int* p = (int*)malloc(sizeof(int)); 為例,要申請 4 個位元組的大小,遍歷之後發現跟 5 Bytes 這個節點最接近,找到一個可以用的單元之後,就將這個單元的地址返還給了 p 指標。以前也提過使用 malloc 申請記憶體空間時返回的記憶體空間可能比申請的實際記憶體空間要大一點點,原因就是在空閒連結串列管理堆空間這樣的系統裡面,它會找最近的那個,找到後的一般都大於等於所需要的記憶體空間,假如 5 Bytes 這個節點下所有的空閒記憶體單元都用完的話,就會找 12 Bytes 節點下的記憶體單元,這樣malloc 返回的記憶體空間就有可能比自己實際申請的記憶體空間要大。
下面看一個靜態儲存區的驗證程式碼:
#include <stdio.h> int g_v = 1; static int g_vs = 2; void f() { static int g_vl = 3; printf("%pn", &g_vl); } int main() { printf("%pn", &g_v); printf("%pn", &g_vs); f(); return 0; }
輸出結果如下:
可以看到這三個地址是順序存放的,因為這三個變數都是存放在程式的靜態儲存區,靜態儲存區在程式裡面有固定的起始地址。
棧,堆和靜態儲存區是程式中的三個基本資料區
到此這篇關於C語言深入講解棧與堆和靜態儲存區的使用的文章就介紹到這了,更多相關C語言 棧與堆內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45