strncpy的實現與不安全性

2021-09-30 08:48:44 字數 700 閱讀 2218

原型:char * strncpy(char *dest, char *src, size_t n);

功能:將字串src中最多n個字元複製到字元陣列dest中(它並不像strcpy一樣遇到null就開始複製,而是等湊夠n個字元才開始複製),返回指向dest的指標。

說明:

如果n > dest串長度,dest棧空間溢位產生崩潰異常。

否則:

1)src串長度<=dest串長度,(這裡的串長度包含串尾null字元)

如果n=(0, src串長度),src的前n個字元複製到dest中。但是由於沒有null字元,所以直接訪問dest串會發生棧溢位的異常情況。

如果n = src串長度,與strcpy一致。

如果n = dest串長度,[0,src串長度]處存放src字串,(src串長度, dest串長度]處存放null。

2)src串長度》dest串長度

如果n =dest串長度,則dest串沒有null字元,會導致輸出會有亂碼。如果不考慮src串複製完整性,可以將dest最後一字元置為null。

綜上,一般情況下,使用strncpy時,建議將n置為dest串長度(除非你將多個src串都複製到dest陣列,並且從dest尾部反向操作),複製完畢後,為保險起見,將dest串最後一字元置null,避免發生在第2)種情況下的輸出亂碼問題。當然嘍,無論是strcpy還是strncpy,保證src串長度

hashmap的執行緒不安全性

首先hashmap在多個執行緒同時對其操作的時候造成的髒讀很統一理解,比如乙個執行緒a對hashmap進行讀操作,乙個執行緒b對hashmap就行寫操作。執行緒b先進入put方法中,此時還沒有寫資料的時候執行緒a輪轉執行,並一直執行到結束,假設執行取到資料為條,這時執行緒b繼續執行新增了一條資料。那...

gets 函式的不安全性

在linux下編譯c檔案時出現 warning the gets function is dangerous and should not be used問題在於gets 函式在獲取輸入時,不會對輸入有檢查,如果無限輸入會造成棧空間溢位,在程式返回時,不能正常的找到返回位址,程式將發生不可 行為。使...

scanf函式的不安全性分析

int scanf char 是其函式宣告。其中只要求第乙個引數是char 即字串即可,而對於其他引數則沒有限制型別和個數,這其中有安全風險。舉個例子 scanf d c i,ch 如果從鍵盤上輸入的資料是 30 a?則變數ch的值是空格字元而不是字元 a 這種錯誤很隱蔽,因此建議讀者盡量不要使用s...