深入理解 C 指標 九 指標的安全問題

2021-05-28 04:51:24 字數 878 閱讀 3295

看下面的例子:

例十七:

char s='a';

int *ptr;

ptr=(int*)&s;

*ptr=1298; 

指標ptr是乙個int*型別的指標,它指向的型別是int。它指向的位址就是s的首位址。在32位程式中,s佔乙個位元組,int型別佔四個位元組。最後一條語句不但改變了s所佔的乙個位元組,還把和s相臨的高位址方向的三個位元組也改變了。這三個位元組是幹什麼的?只有編譯程式知道,而寫程式的人是不太可能知道的。也許這三個位元組裡儲存了非常重要的資料,也許這三個位元組裡正好是程式的一條**,而由於你對指標的馬虎應用,這三個位元組的值被改變了!這會造成崩潰性的錯誤。

讓我們來看一例:

例十八:

1。 char a;

2。 int *ptr=&a;

...

3。 ptr++;

4。 *ptr=115; 

該例子完全可以通過編譯,並能執行。但是看到沒有?第3句對指標ptr進行自加1運算後,ptr指向了和整形變數a相鄰的高位址方向的一塊儲存區。這塊儲存區里是什麼?我們不知道。有可能它是乙個非常重要的資料,甚至可能是一條**。而第4句竟然往這片儲存區里寫入乙個資料!這是嚴重的錯誤。所以在使用指標時,程式設計師心裡必須非常清楚:我的指標究竟指向了**。在用指標訪問陣列的時候,也要注意不要超出陣列的低端和高階界限,否則也會造成類似的錯誤。

在指標的強制型別轉換:ptr1=(type*)ptr2中,如果sizeof(ptr2的型別)大於 sizeof(ptr1的型別),那麼在使用指標ptr1來訪問ptr2所指向的儲存區時是安全的。如果sizeof(ptr2的型別)小於 sizeof(ptr1的型別),那麼在使用指標ptr1來訪問ptr2所指向的儲存區時是不安全的。至於為什麼,讀者結合例十七來想一想,應該會明白的。

深入理解c指標 學習筆記 7 0指標安全及錯誤使用

1 位址空間布局隨機化 資料執行保護 2 指標的定義 int ptr1,ptr2 錯誤的定義2個指標 int ptr1,ptr2 正確定義2個指標 使用巨集定義輔助 define pint int pint ptr1,ptr2 這樣也有問題,巨集定義只是起到乙個書寫替代作用,在編譯過程中,實際和第一...

深入理解C指標之三 指標和函式

原文 深入理解c指標之三 指標和函式 理解函式和指標的結合使用,需要理解程式棧。大部分現代的塊結構語言,比如c,都用到了程式棧來支援函式的執行。呼叫函式時,會建立函式的棧幀並將其推到程式棧上。函式返回時,其棧幀從程式棧上彈出。在使用函式時,有兩種情況指標很有用。一種是將指標作為引數傳遞給函式,函式可...

深入理解C指標之三 指標和函式

原文 深入理解c指標之三 指標和函式 理解函式和指標的結合使用,需要理解程式棧。大部分現代的塊結構語言,比如c,都用到了程式棧來支援函式的執行。呼叫函式時,會建立函式的棧幀並將其推到程式棧上。函式返回時,其棧幀從程式棧上彈出。在使用函式時,有兩種情況指標很有用。一種是將指標作為引數傳遞給函式,函式可...