1.這里總結動態內存管理里面的錯誤
(1)使用malloc開辟空間以后直接賦值
這個就是malloc開辟失敗返回空指針,直接給空指針賦值就是錯誤的,
tip1:使用malloc開辟空間以后一定要判斷是否為空
(2)
越界訪問:一共20字節,一循環20*4=80字節,造成越界訪問
(3)釋放非動態開放
(4)釋放動態內存的一部分
這里指針雖然移動了,但是不能從中間某個位置開始釋放,只會從頭
(5)對一塊空間多次釋放
這個的解決方案就是及時置為NULL,這樣第二次的釋放就不起作用了
(6)內存忘記釋放(內存泄露)
動態內存空間,只有2種方式還回去,一種是free釋放,2是程序退出
這個在函數里面,出作用域以后就沒了,所以會出現內存泄漏,應該及時釋放,或者讓主函數知道
2.筆試題目
#######(1)
傳遞str變量本身,只有把地址取出來才是傳遞地址
--1.getmemory里面的形參開辟了空間,但是對test里面的實參沒有影響
---2.這里面相當于對空指針解引用,程序會崩潰,因為要想拷貝,就要*dest=*src,相當于對空指針
進行解引用操作
---3.開辟的空間,沒有釋放,存在內存泄漏
----4.printf(str)實際上給的是首個元素的地址,所以跟打印字符串的效果是一樣的
這個是修改方案
(1)這里無非就是想把開辟的80字節給str,我們傳地址就可以了,然后使用二級指針進行接收
(2)這樣傳遞地址就可以把80字節空間給str,這個時候我們依然可以釋放空間,置為空指針
######2.
(1)顯然,這里是隨機值,
(2)數組名是數組首個元素的地址,p向內存申請空間,返回地址,我們可以知道地址,可以找到
這塊空間,但是他的生命周期結束,內存還給操作系統,訪問就相當于野指針。
(3)這種問題就是訪問棧空間的地址問題,其實最簡單的就是局部變量,如下:
########3.
這里是可以輸出的,問題就是沒有free釋放,釋放之后置為空指針,打印之后應該釋放掉;
#######4.
(1)開辟100字節空間,但是釋放之后需要置為空指針
3.腦圖
4.內存區域分配
在棧區創建,會自動銷毀,但是malloc,realloc等開辟的空間放在堆區,需要程序員手動釋放
普通的局部變量在棧區開辟空間,static修飾了以后放在數據段,也就是靜態區,這些在程序結束
才會銷毀,所以他的生命周期比較長。