[英]What happens when you give a null string to a C standard function?
C標准庫中有許多可愛的字符串函數,例如(在string.h
)
char *strcat(char *str1, const char *str2);
或者(在stdlib.h
)
long int strtol(const char *nptr, char **endptr, int base);
(出於這個問題的目的,忽略調用這些函數的智慧。)
如果我將任何這些函數傳遞給NULL
指針會發生什么? (我的意思是(char *) 0
,而不是空字符串。)
我在手冊頁或網頁上找不到任何答案。
這使我認為它是實現定義的,但它也可能意味着自動分段錯誤; 也沒有指定特殊的錯誤行為或返回值。
在同一個實現中,行為甚至會因功能而異嗎?
C標准在7.21.1字符串函數約定中表示,第2條 :
除非在本子條款中對特定函數的描述中另有明確說明,否則此類調用上的指針參數仍應具有有效值,如7.1.4中所述。
7.1.4庫函數的使用 :
如果函數的參數具有無效值(例如函數域外的值,或程序地址空間外的指針,或空指針,或指向不可修改存儲的指針時相應的參數不具有const限定條件)或具有可變數量參數的函數不期望的類型(提升后),行為未定義。
strcat()
在7.21.3.1中的描述沒有說明NULL指針是一個有效的輸入,因此,我得出結論,如果任何輸入指針為NULL,則行為正式未定義。
標准沒有說什么,所以它是未定義的行為。 在許多平台上,你會得到一個seg-fault,因為它將取消引用空指針。
除非指定了函數對NULL值的作用(例如endptr
是NULL定義),否則結果為undefined - 崩潰,錯誤代碼,中止或惡魔。
C規范沒有提到如果你將錯誤的參數傳遞給strcat
和類似函數會發生什么,所以它完全依賴於實現。 但我敢打賭,至少在發布版本中沒有多少實現檢查NULL
參數。
它將依賴於實現。 但是你會在許多實現上遇到段錯誤。 由於字符串函數被廣泛使用,因此這些庫函數通常會執行nullcheck。 (必須因為效率)
編輯:正如@Alex提到的那樣,它不依賴於實現; 這是未定義的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.