C 指標篇之 記憶體跨函式使用問題

2021-10-09 17:00:52 字數 815 閱讀 2131

1、靜態變數不能跨函式使用

靜態變數系統是固定分配記憶體的屬於靜態記憶體,一旦該函式使用結束所有靜態變數記憶體空間都會重置釋放,相當於清零

例如下面這段**:

語法上並沒有報錯,編譯器也能執行出來,但是邏輯上是不對的

當fun()函式使用結束後,其函式內部由系統自動分配的靜態變數p和i記憶體空間會釋放,所以q只能儲存i的位址不能返回i的空間。

#include

#include

void

fun(

int*

*p)int

main

(void

)

2、動態記憶體可以跨函式使用(二級指標變數)

動態記憶體和靜態記憶體最大的區別就在於:

動態記憶體需要使用free()函式人為釋放

靜態記憶體則不需要人為釋放,執行結束系統自己釋放

例如下面這段**:

*p = (int *)malloc(sizeof(int));

fun()函式內部使用了malloc()可以動態分配記憶體,不會因為函式執行結束就釋放記憶體;

#include

#include

#include

//分配記憶體函式

void

fun(

int*

*p)int

main

(void

)

跨函式使用記憶體 指標常見問題

include include voidf1 int q intmain 執行結果 分析 靜態 main函式中 p 指向 i 的位址,所以,p i 呼叫 f1 函式時,q 拷貝了 p 的內容即 i 的位址,故 q p i 所以 i 的值改變了。include include voidf2 int q...

C 之記憶體洩漏篇

前段時間面試經常被問到記憶體洩漏。今天小總結一下 記憶體洩漏的發生是由於使用者在堆上分配了空間,但卻沒有釋放它。持續的記憶體洩漏最終將導致堆的耗盡,後繼的記憶體分配將會失敗。引發記憶體洩漏的原因是用new分配的記憶體沒有用delete釋放掉。如 可能在onpaint這樣的繪畫視窗的函式中分配了空間,...

C語言篇之記憶體

記憶體編址 定址和記憶體對齊 記憶體編址是以位元組為單位的,其中int整形和cpu本身的資料位寬是一樣的,如32位cpu int是32位,整數型別當資料型別和記憶體相匹配時才能獲得最好的效能。記憶體的對齊訪問不是邏輯問題而是硬體問題,對齊訪問很配合硬體所以效率會很高,因為非對齊訪問和硬體本身不搭配,...