看一道大華的面試題,題目并不難。
問strcat strncat strcmp strcpy哪些函數會導致內存溢出?如何改進?
這幾個函數,要說跟內存溢出沒有關系的,只有strcmp。
它的功能只是比較兩個字符串是否相等,給定地址,然后從地址開始逐個向后比較,并不涉及寫內存,所以也不存在溢出的說法。
剩下的三個函數都有可能導致內存溢出。
就拿strcpy來說,作用就是把源字符串拷貝到目的內存中,實現的方法就是循環逐個賦值,如果源字符串過長,strcpy也不好把控,這樣就會導致一些未知的情況發生。
那么有人可能會問,strcpy里面為什么不做個判斷,如果目的內存不夠,就停止賦值。
我們來看下strcpy的參數。
char *strcpy(char *dest, const char *src);
只有兩個地址,在C語言中,只給你一個地址,是不好知道從這個地址開始,向后多少個字節是能用的。
于是在某些平臺上,就出現了strcpy_s這樣的函數。
strcpy_s(char *dest, int size, const char *src);
功能和strcpy差不多,就是多了個參數,第二個參數表示目的內存的大小,這樣在拷貝的時候,就能精確的判斷出內存是否越界。
當然了,如果你傳參的時候瞎寫了一個長度,這就不是函數的問題了,是你的問題。
strcat也是用樣的問題,把一個字符串接在另一個字符串的后面,這個過程也沒有考慮內存越界的問題。
strncat雖然可以指定連接的字符個數,但是函數內部在使用內存的時候,也沒有做內存越界的判斷,越不越界只能靠用戶自己把握。
審核編輯:劉清
-
C語言
+關注
關注
180文章
7630瀏覽量
140552 -
內存溢出
+關注
關注
0文章
10瀏覽量
1320
原文標題:C語言的哪些函數不安全
文章出處:【微信號:學益得智能硬件,微信公眾號:學益得智能硬件】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
C語言函數調用過程中的內存變化解析
C語言內存知識總結:memset函數和calloc函數
MicroBlaze:malloc 函數動態分配內存溢出

評論