簡體   English   中英

將空字符串賦給C標准函數會發生什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM