本篇 ShengYu 介紹 C/C++ 程式的常見陷阱與範例,C/C++ 寫程式時有許多常見的陷阱,以下是一些 C/C++ 常見陷阱的範例,同時也會說明如何避免與一些使用建議。
以下介紹 C/C++ 程式的常見陷阱分為,
- 空指針(Null Pointers)陷阱
- 記憶體洩漏(Memory Leaks)陷阱
- 緩衝區溢出(Buffer Overflow)陷阱
- 未檢查的輸入(Unchecked Input)陷阱
- 未處理的異常(Unhandled Exceptions)陷阱
空指針(Null Pointers)陷阱
誤用空指針的話將會讓程式crash崩潰,以下為空指針的範例程式碼,1
2int* ptr = nullptr;
*ptr = 5; // 將導致crash,因為ptr是空指針
如何避免:在使用指針之前,確保它們不是空指針。
未初始化的指針或指向無效記憶體的指針可能導致程式崩潰。務必在使用指針之前進行初始化,並謹慎檢查指針是否為NULL,修正空指針陷阱後的程式碼如下,1
2
3
4int* ptr = nullptr;
if (ptr != nullptr) {
*ptr = 5; // 不會crash
}
要確保在使用指針之前檢查它們是否為空指針。
記憶體洩漏(Memory Leaks)陷阱
以下為記憶體洩漏的範例程式碼,1
2int* data = new int[10];
// 忘記釋放記憶體
如何避免:使用delete[]
來釋放動態分配的記憶體。
忘記釋放動態分配的記憶體可能導致記憶體洩漏。使用new
和delete
(C++程式)或malloc
和free
(C程式)時,確保釋放記憶體,修正記憶體洩漏後的程式碼如下,1
2
3int* data = new int[10];
// 使用 data
delete[] data; // 釋放記憶體
使用new
後記得使用delete[]
來釋放動態分配的記憶體,以避免記憶體洩漏。
緩衝區溢出(Buffer Overflow)陷阱
以下為緩衝區溢出的範例程式碼,1
2char buffer[10];
strcpy(buffer, "This is a long string that overflows the buffer");
如何避免:使用strncpy
等函數,或者使用std::string
(C++)來處理字串,以確保不會超出緩衝區。
對陣列或緩衝區進行寫入時,超出其邊界可能導致不安全的程式行為。使用標準函數(例如strncpy
而不是strcpy
)或容器類型(例如std::vector
)以避免此問題,修正緩衝區溢出後的程式碼如下,1
2char buffer[100];
strncpy(buffer, "This is a long string that won't overflow the buffer", sizeof(buffer));
使用strncpy
,並確保不會超出緩衝區的大小。
未檢查的輸入(Unchecked Input)陷阱
以下為未檢查的輸入的範例程式碼,1
2
3char query[100];
cin >> query;
// 未驗證用戶輸入,可能受到SQL注入攻擊
如何避免:使用參數化查詢或驗證用戶輸入,以避免安全問題。
未驗證用戶輸入可能導致安全問題,如SQL注入或格式化字串攻擊。始終驗證和過濾用戶輸入,並使用參數化查詢來防止SQL注入,修正未檢查的輸入後的程式碼如下,1
2
3char query[100];
cin.getline(query, sizeof(query));
// 驗證用戶輸入,以避免安全問題
使用cin.getline
等函數來讀取和驗證用戶輸入,以確保安全性。
未處理的異常(Unhandled Exceptions)陷阱
以下為未處理的異常的範例程式碼,1
2
3
4
5try {
// ...
} catch (std::exception& e) {
// 未處理異常
}
如何避免:確保捕獲並處理異常,或者將它們向上拋出以便在適當的地方處理。
處理異常可能導致程式崩潰。使用try-catch區塊來捕獲異常並處理它們,以確保程式的穩定性,修正未處理的異常後的程式碼如下,1
2
3
4
5try {
// ...
} catch (std::exception& e) {
// 處理異常,例如日誌記錄或回報錯誤
}
確保捕獲並處理異常,以確保程式的穩定性。
以上就是 C/C++ 程式的常見陷阱與範例介紹,這些範例展示了 C/C++ 中的一些常見陷阱,以及如何避免它們。要寫出更健壯和安全的程式,需要謹慎處理這些問題,以確保程式碼的正確性和可靠性。
如果你覺得我的文章寫得不錯、對你有幫助的話記得 Facebook 按讚支持一下!
其它相關文章推薦
如果你想學習 C++ 相關技術,可以參考看看下面的文章,
C/C++ 新手入門教學懶人包
C/C++ fopen 用法與範例
C/C++ fread 用法與範例
C/C++ fgets 用法與範例
C/C++ fputs 用法與範例
C/C++ fclose 用法與範例