注:部落格中內容主要來自《狄泰軟體學院》,部落格僅當私人筆記使用。
測試環境:ubuntu 10.10
gcc版本:4.4.5
一、野指標
1) 指標變數中的值是非法的記憶體位址,進而形成野指標
2) 野指標不是null指標,是指向不可用記憶體位址的指標(比如函式返回值為陣列)
3) null指標並無危害,很好判斷,也很好除錯
4) c語言中無法判斷乙個指標所儲存的位址是否合法
二、野指標的由來
1) 區域性指標變數沒有被初始化
2) 指標所指向的變數在指標之前被銷毀
3) 使用已經釋放過的指標
4) 進行了錯誤的指標運算
5) 進行了錯誤的強制型別轉換
例項分析
野指標初探
41-1.c
#include #include int main()
free(p1); //釋放記憶體,但是p1中儲存內容沒變,p1因此變成野指標
for(i=0; i<40; i++)
return 0;
}
操作:
1) gcc 41-1.c -o 41-1.out編譯正確,列印結果:
segmentation fault (core dumped)
分析:
p1[i]記憶體被釋放後仍然被賦值,對野指標操作非法;p2[i]指向了作業系統不允許放的記憶體也會報錯。
2) 新增**:
#include #include int main()
free(p1); //釋放記憶體,但是p1中儲存內容沒變,p1因此變成野指標
printf("p1 = %p\n",p1);
for(i=0; i<40; i++)
return 0;
}
gcc 41-1.c -o 41-1.out編譯正確,列印結果:
p1 = 0x8ff8008
p1 = 0x8ff8008
segmentation fault (core dumped)
分析:
p1指向的記憶體被釋放後,仍然儲存之前指向的位址,最好用null重新賦值。
三、基本原則
1) 絕不返回
區域性變數和區域性陣列的位址
2) 任何變數在定義後必須0初始化
3) 字元陣列必須確認0結束符後才能成為字串
4) 任何使用與記憶體操作相關的函式必須指定長度資訊
例項分析
無處不在的野指標
41-2.c
#include #include #include struct student
;char* func()
void del(char* p)
int main()
操作:
1) gcc 41-2.c -o 41-2.out編譯有警告:
41-2.c:15:2: warning: function returns address of local variable [-wreturn-local-addr]
return p;
^
執行錯誤:
segmentation fault (core dumped)小結:
記憶體錯誤是實際產品開發中最常見的問題,然而絕大多數的bug都可以通過遵循基本的程式設計原則和規範來避免。
因此,在學習的時候要牢記和理解記憶體操作的基本原則,目的和意義。
C 41 記憶體操作相關問題分析一
野指標 指標變數中的值是非法的記憶體位址,進而形成野指標。野指標不是null指標,是指向不可用記憶體位址的指標。null指標並無危害,很好判斷也很好除錯。c語言中無法判斷乙個指標儲存的位址是否合法 野指標的由來 區域性指標變數沒有被初始化。指標所指向的變數在指標之前被銷毀。使用已經釋放的過的指標。進...
40 記憶體操作經典問題分析1
1 野指標 2 野指標的由來 include include int main free p1 p1變成野指標,p1裡面還存著位址值,應該p1 null 糾正 include include int array 40 int main free p1 printf p n p1 p1 null p1...
PV操作 經典問題分析
為了提高在實際問題中分析和思考多個執行緒之間同步互斥問題的能力,接下來將講解 pv操作,這也是作業系統中的重點和難點。本文將會先簡要介紹下 pv操作的 和基本使用方法,然後再通過兩道經典的計算機考研真題 放水果和安全島來示範如何運用 pv操作。先講講pv操作的起源和用法。1962年,荷蘭學者dijk...