日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言 跨函数使用内存.

發布時間:2025/3/20 编程问答 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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语言 跨函数使用内存.的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。