關於C c 記憶體分配問題

時間 2022-03-27 18:07:26

1樓:不知詳解

前者和後者都一樣犯了同乙個錯誤

由於變數是在棧中分配 每個程式都有自己的棧,也就是這裡面的資料不會被其他的程式修改,但是可能會被你自己修改。

所以當你立刻返回這個位址,並且立刻按照正確的型別讀取它那麼你所獲得的值是正確的.這就是你的試驗結果 看起來沒有什麼錯誤.

但是這種小"技巧"很可能讓你的程式崩潰或者執行結果謬之千里。因為當你返回了已經釋放的區域性變數的記憶體的時候。那塊記憶體可以被分配給其他變數,也就是說你的指標指向的是一塊不知道屬於哪個變數的記憶體.

因為這塊記憶體隨時可以分配給程式中的其他變數.並且值會隨之改變.

請看如下**:

#include

#include

int *fun()

int *fun2()

int main(void)

你會發現fun()和fun2()中的區域性變數的位址是一樣的

也就是說fun()返回的指標所指向的記憶體,p指向的記憶體隨時會意外改變

再試試如下**

#include

#include

int *fun()

int *fun2()

\int * funset(int k)

int main(void)

----------

書上說不要返回區域性變數的位址就是因為這個位址指向的記憶體已經是free的

隨時可以分配給別的變數。

free的記憶體,它不是由你使用的,而是由程式自動使用,程式會隨時讓這個記憶體發生你沒打算幹的改變.比如分配給別的區域性變數,棧的分配工作是在編譯期決定的。不是動態分配。

-----------

你再想想假如你做了如下的事情

返回了乙個區域性變數的位址儲存到p中

你以為這塊記憶體沒有變化並且打算利用這塊記憶體儲存點東西。

然後呼叫了乙個函式。

然後你莫名其妙的發現p所指向的記憶體莫名其妙的變化了。

2樓:匿名使用者

詳細講起來很複雜,我給你找到乙個文章:

你自己仔細體會吧.

3樓:匿名使用者

main中返回的位址當然和函式內的陣列位址是相同的,這是函式返回值設計的最重要原因之一,只是出了函式體,這個位址指向的記憶體空間「並不存在」了(可能被**,可能被其它程式占用)。

所以當你再次去訪問時,不僅編譯過程中會警告你,甚至報錯,即使你僥倖執行起來,也會彈出記憶體不可訪問的錯誤。

c 中記憶體分配問題,C 中記憶體分配問題

以32位平台為例,char c 宣告乙個字元變數c,並為其分配乙個8bit的空間,假設為0x22334455 c 41 將字元 a 放到剛才分配的0x22334455空間中 char p null 宣告乙個字元指標p,並為其分配乙個32bit的空間,假設為0x44556677,p的值初始化為0 p ...

請教下關於記憶體分配的問題

只是理論值,只看得了3g正常啦。不能識別的記憶體 非windows管理記憶體 連作業系統都不能識別管理就更談不上分配給顯示卡了。還有至於樓上所說的做成ramdisk把剩餘的記憶體變成硬碟分割槽的方法,是可行的,但是要補充一點如果不是windows管理記憶體 就是識別不了的記憶體部分 生成的ramdi...

關於遺產分配的問題,關於遺產分配問題

1 該房產已經賣於你二哥,且已過戶。因此,該房產是你二哥的個人財產,而並非遺產。2 該房產買賣合同的雙方,是你二哥和你父母。你父母有權追究你二哥不履行交付購房款的法律責任。父母去世後,該合同的法律權利義務由你們繼承。即,你和你大哥,可以要求你二哥交付房款作為父母遺產進行繼承。你二哥交付的房款中,有1...

關於動態記憶體分配,C語言中的動態記憶體分配的用法舉例

1 對於堆記憶體 即動態分配的記憶體malloc,new等 的大小,最大可達4g,我在我電腦上測試 vc6.0,我記憶體512 1g左右還能看到結果,再大機器就慢死了,這只是受你機器虛記憶體和系統物理記憶體限制。不過我們程式設計的時候開闢這樣大的空間是沒有意義的,除非你有足夠牛逼的硬體機器,否則我們...

關於記憶體問題,記憶體問題

用 超級兔子記憶體整理 整理一下。或者重起。記憶體問題 原因總結起來,有以下方面,偶爾出現,點 取消,即可!1.電腦中了木馬或者有病毒在干擾!試試 防毒軟體,360安全衛士 360防毒雙引擎版,或者金山衛士 金山毒霸,建議 修復 高危 和 重要 漏洞!使用 木馬雲查殺 和 360防毒 全盤掃瞄 和 ...