二、動態記憶體開闢錯誤經典筆試題
總結在使用動態記憶體分配程式中,常常會產生不易發現的錯誤,這其中就包括對null指標進行解引用,訪問未知記憶體區域(越界訪問&訪問未初始化指標指向區域),記憶體洩漏,釋放非動態記憶體開闢空間(向free函式傳遞乙個並非由malloc函式返回的指標),釋放動態記憶體開闢的部分空間,空間釋放後利用指標被繼續使用,不檢查空間分配結果。
所謂動態記憶體分配(dynamic memory allocation)是指在程式執行的過程中動態地分配或者**儲存空間的分配記憶體的方法。動態記憶體分配不象陣列等靜態記憶體分配方法那樣需要預先分配儲存空間,而是由系統根據程式的需要即時分配,且分配的大小就是程式要求的大小。
我們在定義陣列時,需要知道陣列的大小,當我們不確定陣列大小時需要定義足夠大的陣列來存放資料,這樣造成了空間的浪費,一旦空間不夠用時又要重新修改程式,這樣的方式是靜態記憶體分配,使用動態記憶體分配可以很好的解決這一問題。
1.對null指標的解引用操作
**如下(示例):
2.對開闢空間的越界訪問動態記憶體錯誤
1.對null指標進行解引用操作
void
test()
正確**:
intmain()
else
return0;
}
**如下(示例):
3.對非動態開闢的空間使用free釋放int
main()
else
for(i =
0; i <=
11; i++
)free
(pa)
; pa =
null;}
return0;
}
**如下(示例):
4.使用free釋放一塊動態記憶體開闢的空間int
main()
**如下(示例):
5.對同一塊記憶體多次釋放int
main()
else
for(i =
0; i <
5; i++
)//沒有全部開闢空間
free
(pa)
; pa =
null;}
return0;
}
**如下(示例):
6.對開闢的記憶體空間忘記釋放,記憶體洩漏問題int
main()
else
for(i =
0; i <
10; i++
)free
(pa)
;free
(pa)
; pa =
null;}
return0;
}
**如下(示例):
1.空指標傳參,類似於值傳遞int
main()
else
for(i =
0; i <
10; i++
)return0;
//未使用free來釋放開闢的記憶體空間
//free(pa);
pa =
null;}
return0;
}
**如下(示例):
1.執行test函式會出現什麼結果
void
getmemory
(char
* p)
// 錯誤**
2.區域性變數和形式引數存在於棧上
**如下(示例):
2.
test
()函式執行出現什麼結果
char
*getmemory()
//錯誤**
3.記憶體洩露問題
**如下(示例):
3.
test
()函式執行的結果是什麼
4.非法訪問記憶體問題
**如下(示例):
4.
test
()函式執行的結果是什麼
以上就是今天要講的內容,本文僅僅簡單介紹了常見的記憶體函式錯誤的使用,如果上述有任何問題,請懂哥指教,不過沒關係,主要是自己能堅持,更希望有一起學習的同學可以幫我指正,但是如果可以請溫柔一點跟我講,愛與和平是永遠的主題,愛各位了。
常見動態記憶體錯誤
一 對null指標的解引用操作 void test 二 對動態開闢空間的越界訪問 void test2 for i 0 i 10 i free p 三 對非動態記憶體使用free釋放 void test3 四 使用free釋放一塊動態開闢記憶體的一部分 void test4 五 對一塊動態記憶體多次...
常見的動態記憶體錯誤
來自 c 和指標.p223 在使用動態記憶體分配的程式中,常常會出現許多錯誤。這些錯誤包括對null指標進行解除引用操作 對分配的記憶體進行操作時越過邊界 釋放並非動態分配的記憶體 試圖釋放一塊動態分配的記憶體的一部分以及一塊動態記憶體被釋放之後還繼續使用它。以下是一些需要注意的事項 1 在請求動態...
常見動態記憶體錯誤 記憶體洩漏
常見動態記憶體錯誤 編譯器不能自動發現動態記憶體錯誤,動態記憶體錯誤通常只能在程式執行時才能 捉到,而且錯誤原因不容易查詢,錯誤本身也不容易捕捉,改錯難度較大。1.動態記憶體分配失敗卻繼續操作 記憶體不足等有可能導致動態記憶體分配失敗,所以使用new請求分配動態記憶體後一定要檢查返回位址是否為nul...