scanf()在讀取數(shù)據(jù)時不檢查邊界亭敢,所以可能會造成內(nèi)存訪問越界:
例如:分配了5字節(jié)的空間但是用戶輸入了10字節(jié),就會導(dǎo)致scanf()讀到10個字節(jié)伐弹。
簡單來說馆铁,如果用scanf()char buf[5]={’\0’};
scanf("%s", buf);
//如果輸入1234567890,則5以后的部分會被寫到別的變量所在的空間上去勇凭,從而可能會導(dǎo)致程序運行異常疚膊。
以上代碼如果用scanf_s()則可避免此問題:
char buf[5]={’\0’};
scanf_s("%s",buf,5); //最多讀取4個字符,因為buf[4]要放’\0’
//如果輸入1234567890虾标,則buf只會接受前4個字符
注: scanf_s最后一個參數(shù)n是接收緩沖區(qū)的大性⒌痢(即buf的容量),表示最多讀取n-1個字符.
PS: 很多帶“_s”后綴的函數(shù)是為了讓原版函數(shù)更安全璧函,傳入一個和參數(shù)有關(guān)的大小值傀蚌,避免引用到不存在的元素,防止hacker利用原版的不安全性(漏洞)黑掉系統(tǒng)蘸吓。