關於C C 的幾點認識

2021-06-16 22:15:20 字數 2060 閱讀 7490

從學習c語言開始,已經接觸這門語言好幾年了,不敢說有多精通,本文就本人以往遇到過的幾個問題做乙個說明。

1、認識c語言的安全隱患。

首先,我們來看乙個簡單的例子。

int ndata = 50;

char szbuf[20];

memset(szbuf,0,20);

strcpy(szbuf,(const char*)&ndata);

我們常見的strcpy函式一般是用來複製字串的,但是我們這裡將乙個整數複製了進來,導致不可預知的結果,突然想到另乙個用於複製的函式memcpy。它能夠複製任意型別的記憶體讀寫塊,我們也來看乙個例子。

char szbuf[20]; 

memset(szbuf,0,20);

char szsrc = "zhouxuguang,hello world!";

memcpy(szbuf,szsrc,strlen(szsrc));

在上面的**中,szbuf總共才20個位元組的記憶體空間,然而szsrc所佔的記憶體空間遠超過20個位元組,這樣就會造成緩衝區溢位,直至程式崩潰。所以說,c語言函式一般不對引數進行檢查,這樣做的目的是保持高效率,但同時也帶來了安全隱患,只要我們在程式設計中注意到這些就可以了。

2、資料型別所帶來的陷阱

在程式設計中,或許有許多人都只注重演算法和流程控制,很少去關注資料型別給你設下的陷阱。如果某一天我成為it公司面試官,我或許會給應聘者出下面這個題目。

借助於c語言庫函式strlen寫乙個函式用於比較兩個字串的長度,函式原型是bool strcompare(char* szone,char* another);。應聘者可能會說,丫的,你這不是玩我嗎?這麼簡單的函式還要我寫?先不說這麼多,那先看看幾組答案吧。

第一種答案:

bool strcompare(char* szone,char* another)

第二種答案:

bool strcompare(char* szone,char* another)

第三種答案:

bool strcompare(char* szone,char* another)

看了上面的三個答案,到底哪乙個對,哪乙個錯呢,或者都有問題呢?

是不是很簡單就寫出來了?我想問,你敢保證沒有錯誤嗎?

首先,我們來認識乙個資料型別,size_t,這個資料型別應該不陌生吧,在很多c語言庫函式和stl中都有見過。它在win32下面實際上是unsigned int。說了半天廢話,怎麼還不到重點,別急,那我們來看看strlen的返回型別是什麼,恰恰就是size_t,假設strlen(szone) 比 strlen(another),相減的結果在數學上是乙個負數,然而unsigned不能表示負數,其最終結果是乙個很大的數,它恆大於等於0,所以該函式用於返回true。

那第二個函式就不會產生這樣的問題,雖然有所改進,但是沒有對引數進行檢查,加入傳進去的引數有乙個為null,就會導致程式崩潰。

所以第三個函式就在第二個函式的基礎上對引數進行了檢查。

3、盡量用前閉後開的for迴圈

for迴圈在程式語言中可以說是運用得非常多,大部分演算法的編寫都與for迴圈有關係。可能有些人覺得for迴圈沒啥,但要真正理解也不是那麼容易。來看乙個例子。

long sumarr(int* arr,unsigned ncount)

return sum;

}

上面的**有什麼問題,如果不仔細看,還真看不出有什麼問題。首先可以肯定的是上面計算陣列和的函式有問題。第一,當ncount為0時,那麼for迴圈中i <= ncount-1永遠為真,為什麼,看上面第二點我分析的。無符號數0減去1就會得到unsigned的最大值,從而導致對陣列arr的非法訪問,最終導致程式崩潰。那麼修改方法可以將ncount改為int型,也可以將i <= ncount-1改為i <= ncount。所以最好採用前閉後開的區間。

今天就寫這麼多,以後本文會更新。

關於STRUCT的幾點認識

1.struct 的巨大作用 面對乙個人的大型 c c 程式時,只看其對struct 的使用情況我們就可以對其編寫者的程式設計經 驗進行評估。因為乙個大型的c c 程式,勢必要涉及一些 甚至大量 進行資料組合的結構體,這些結 構體可以將原本意義屬於乙個整體的資料組合在一起。從某種程度上來說,會不會用...

關於閉包的幾點認識

什麼是閉包?閉包一般人都說,是函式中定義的乙個函式,有的人也說函式中套函式。其實準確點說,閉包是乙個能夠訪問到其他函式內部變數的函式,當然這個其他函式不是父子關係的函式,而是兄弟關係的函式。舉個最簡單的例子引導一下 function alwayslinger console.log num num ...

對linux分割槽的幾點認識

對windows使用者來說,作業系統必須裝在同一分割槽裡,它是商業軟體 所以你沒有選擇的餘地!對red hat linux來說,你有了較大的選擇餘地,你可以把系統檔案分幾個區來裝 必須要說明載入點 也可以就裝在同乙個分割槽中 載入點是 下面我們看看可以建立哪些分割槽 僅列常用幾種 boot分割槽,它...