使用 glibc,
- 如果您的程式呼叫
printf("%s", NULL),您會得到(null),但是 - 如果你的程式呼叫
printf("%p", NULL),你會得到(nil).
但為什么會這樣呢?
注意:這不是關于 C 語言標準的問題,其中為"%s"說明符傳遞空指標會導致未定義的行為;我特別詢問 glibc 的選擇(這些值在 glibc 源代碼中是硬編碼的)。
uj5u.com熱心網友回復:
這是 Roland McGrath 的問題。
他在 1995 年 2 月 17 日添加了 vfprintf.c 作為 glibc 初始提交的一部分。這個初始版本包含針對這些特定情況硬編碼的“(nil)”和“(null)”。對此提交的唯一評論是“初始提交”。
https://github.com/lattera/glibc/blob/28f540f45bbacd939bfd07f213bcad2bf730b1bf/stdio/vfprintf.c
對于更多背景關系,至少從 1994 年 5 月 27 日起,FreeBSD 4.4 中就出現了“(null)”作為字串的使用,盡管%p格式說明符沒有特殊的字串:
https://github.com/freebsd/freebsd-src/commit/58f0484fa251c266ede97b591b499fe3dd4f578e
uj5u.com熱心網友回復:
C標準。7.1.4
?1 除非在隨后的詳細說明中另有明確說明,否則以下每一條陳述句都適用:如果函式的引數具有無效值(例如函式域之外的值,或函式地址空間之外的指標)程式,或空指標,或指向不可修改存盤的指標(當相應的引數不是 const 限定的)或型別(提升后)不是具有可變數量引數的函式所期望的,行為是未定義的。
由于 C 標準沒有指定如果程式員使用%s格式說明符傳遞 NULL 指標會發生什么,上述一般規則適用。
IMO 這是未定義的行為,沒有不一致之處。任何將 NULL 傳遞給print函式 using 的程式%s都是無效的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/336477.html
