banner
李大仁博客

李大仁博客

天地虽大,但有一念向善,心存良知,虽凡夫俗子,皆可为圣贤。

[C語言教程]指標轉換方式實現C語言的指標操作安全程式碼

今天講點比較枯燥的理論知識,關於 C 語言的安全指標,如果你習慣於用 C 語言,那麼會知道 C 語言的指標操作是很不安全的,但是這反而是 C 語言的特色之一,同時增強了 C 語言的靈活性和高效性,我本人也是比較偏愛於 C 語言的,並不是 C++ 或者其他語言在算法方面不行,而是 C 語言的算法表述更加易於理解和運行更加高效,往往專家編程或者高效編程會採用 C 或者它的發展 C++,但是對於初學者來說,要正確運用好 C 尤其是它的指標確實比較困難,所以我在此講解幾種 C 安全指標的處理方法。但是在此說明,請保持良好的編程習慣和正確的 C 指標處理方法,本文只提供一些

首先講點基礎的,什麼叫指標(pointer),簡單點指標也是一種特殊的數據結構,特殊在它的內容只是表示一個地址,而且它的操作是面向這個地址中的數據的,請注意不是地址,地址是操作系統進行內存分配的單位,並且已經確定的,為什麼指標操作不安全?大部分原因在於 C 在面向地址單元的操作不採取任何保護性措施,而對於操作系統而言,部分內存地址,比如重要的系統數據,往往需要進行保護,那麼結果會很鬱悶了,如果我用 C 編程修改這些數據,(當然操作系統會有保護措施),會讓系統出現問題,甚至宕機,因此說 C 的指標不安全並不是指標的數據結構不安全,而在於指標的操作會產生不可預料的結果,對於你的系統和程序而言是很危險的。

那如何是指標安全呢?目前主要有兩個方法:指標轉換,堆棧保護,指標轉換主要是使指標轉換為一種安全的數據結構,增加效驗數據的過程,另外堆棧保護主要是使用了類似 C++ 類的私有保護的方式,將指標放置在一個限制訪問範圍的區域內,而區域則限制該指標的使用,從而實現指標安全,但是實現比較複雜,

下面我主要講點使用指標轉換實現指標安全的方法,看下面的代碼:

typedef int type_int;/* 定義保護的指標類型這裡用 int*/

typedef struct {
type_int value;/* 指標指向的數據的值 */
type_int * pointer;/* 指向指標 */
} Ptype_int;/* 指標類型 */

int init (Ptype_int p){/* 初始化,可用於釋放指標 */
p.value=0;
p.pointer=&p.value;/* 取地址,這裡使用了引用方式,便於理解 */
return 1;
}

int check (Ptype_int p){/* 數據檢查 */
if(p.value==*(p.pointer))
return 1;
else
return 0;
}

int assignValue (Ptype_int p , type_int v){/* 直接賦值操作 */
if(check(p)){
p.value=v;
*(p.pointer)=v;
return 1;
}
else
return 0;
)

int assignPointer (Ptype_int p , type_int *v){/* 指標賦值操作 */
if(check(p)){
p.pointer=v;
p.value=*v;
return 1;
}
else
return 0;
)
/* 以上定義了基本的複製操作,比較,複製等操作基本相同,可根據需要定義 */

int main(){
type_int i = 0;
type_int *pi=i;
Ptype_int p;
init (p);/* 初始化 */
assignValue (p , i);/* 直接賦值 */
assignPointer (p , pi);/* 指標賦值 */
}

相信原理很簡單吧,就是把指標的操作轉換為面向結構體的操作。但是結構體的定義使得其擁有自我效驗機制,因為本程序中的所有賦值操作並沒有設計指標操作,全部轉換成函數調用,也就不存在指標安全問題了

本程序的原理:因為指標在物理層面上只是一個保存內存地址的內存單元,但是在我們在使用上主要用到的是其指向的地址單元內容,從而產生了安全問題,因此定義一個包含數據和指標的結構體,其中的 type_int 可以是其中 type_int * 指向的內容,用與效驗,同時在初始化階 type_int * 又是直接指向 type_int 的,所以 type_int * 可以很安全的使用,同時加上 type_int 和 type_int * 的比較效驗,又增加了安全性

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。