C语言 跨函数使用内存.
生活随笔
收集整理的這篇文章主要介紹了
C语言 跨函数使用内存.
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. 函數執行完成時,里面的局部靜態變量所占的內存會被自動釋放 ????????
首先看個簡單的例子程序:
#include <stdio.h>int f(){int j=20;return j; }int main(){int i;i = f();return 0; }
可以見到上面 main函數 調用了f()函數,? 而f()里面定義了1個整形變量j.
問題是, 如果f()被調用完成后, 也就是 i=f(); 這條語句執行完后,??? f()里面的j所占的內存還存在嗎?
答案是否.? 首先j是1個局部變量, 而且j是1個靜態分配變量, 所以當f() 結束時,? f()里面的局部靜態分配內存的變量所占的內存都會被自動釋放.
注意靜態分配內存的變量不一定是靜態變量(static 前序)
如果不釋放有什么后果?? 假如f() 在不同的地方被調用了1000次,? 那么里面的j就占用了4byte * 1000 接近4MB的內存,? 可用內存就會越來越少.
2. 內存空間傳遞的方式--內存頭部字節的地址(指針)
那么main() 函數有無可能使用f函數定義的內存空間呢?
上面講到, 局部靜態分配內存變量肯定不行了, 因為一旦f() 被執行完. 里面的靜態分配內存的變量所占內存會被釋放嘛...
那么假如f() 里面分配了1塊內存(連續的),? 如果main函數要獲得內存的內容, 則必須獲得這塊內存的地址,? 我們知道內存里每1個單元都有1個內存地址.??? 因為這塊內存是物理連續的, 我們之需要獲得內存頭部地址就ok了
那么f() 怎么把地址穿給main呢?
第一步肯定是 在mian里定義1個指針, 用于接受這個地址.
第二步呢?
3. 三個利用函數給指針賦值的例子.
就如一條選擇題.? 下面3個程序能能給main里的指針p 獲得1個合法的變量地址呢?
A)
void f(int *q){int j=20;q=&j; }int main(){int *p;f(p); return 0; }
我們先看看例子A,??? 在main函數里定義1個 指針變量p,?? 然后把指針變量p作為參數傳遞給f, 然后f里面給這個參數賦值..
首先main函數里的變量p 本身就是1個指針變量,? 而f的形參也是指針變量,? 所以這個傳遞實際上是按值傳遞
稍稍有點編程基礎的都知道按值傳遞的是形參的值是修改不了的. 所以p 作為參數被f(p)執行完. p的值是不變的.
A是錯誤的.
B)
void f(int ** q){int j=20;*q=&j; }int main(){int *p;f(&p); return 0; }
我們來看看B,? 見到main是以指針p本身的地址(不是指向的地址)(&p)穿給f,? f函數里面把變量j的地址傳給了p本身
q = &p ==> ?? *q =(*&p)= p
所以p的值的確被改變了.
那么B選項是正確的嗎???
的確p通過f函數獲得了1個地址.??
但這個地址是j的地址, 而j是1個局部靜態分配內存的變量啊, 上面說過,當 f被執行完. j就會被釋放.
也就是雖然p獲得了j的地址, 但是j本身被釋放了, 所以也不是1個合法的變量地址.?
B也是錯誤的.
C)
#include <stdlib.h> void f(int ** q){*q = (int *)malloc(sizeof(int));**q = 20; }int main(){int *p;f(&p); return 0; }
C..
使用了動態分配內存, 在f函數分配了1個長度為1個int整形長度的內存(4字節),? 然后把這個內存的頭部地址穿給p.
那么在main里面能否使用這塊內存?
答案是可以的啊, 因為在f函數里面. *q??? 也就是p 指向的內存并沒有被手動釋放啊..
所以C是正確的
由C這個例子我們可以看出兩點:
1) 利用動態分配內存就可以實現跨函數使用這塊內存了, 前提是這塊內存未必釋放.
2) 利用malloc 動態分配的內存, 最終必須手動釋放內存.
如果忘記了釋放有什么后果, 那么一般要等到程序結束時才會釋放這塊內存了.
其實也不一定, 我們平時使用操作系統時是不是覺得越用內存越少?
實際上很多操作系統都是由c/c++寫成了,? 如果程序員忘記手動釋放內存, 就會導致內存泄露...? 可用內存就越來越少.
4. 1個稍稍復雜一點的跨內存使用的例子
??? 其實也不是很復雜啦,
??? 下面這個小程序我們會定義1個create_list()函數.
??? 利用create_list函數劃分1個內存, 傳給其他函數.
#include <stdio.h> #include <stdlib.h> #include <string.h>struct Student * Create_list(); void memory_1(); void Show_list();int memory_main(){memory_1(); printf("memory main done\n");return 0; }struct Student{int sid;int age;char name[100]; };void memory_1(){struct Student * p = Create_list();p->sid = 11; p->age = 24; strcpy(p->name,"JasonPoon");Show_list(p); }struct Student * Create_list(){struct Student * pst;pst = (struct Student *)malloc(sizeof(struct Student)*1);return pst; }void Show_list(struct Student * pst){printf("sid is %d, name is %s, age is %d\n",pst->sid, pst->name, pst->age); }
輸出:
gateman@GMPC Main $ ./main sid is 11, name is JasonPoon, age is 24 memory main done
總結
以上是生活随笔為你收集整理的C语言 跨函数使用内存.的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 利用malloc()和real
- 下一篇: 线性结构 -- 连续存储(数组), 1个