2013-05-03 429 views
12

特別是,以下是明確定義的,還是表現出未定義的行爲?我可以將空指針傳遞給memcmp嗎?

memcmp(0, 0, 0); 

C和C++之間的這種不同嗎?理想情況下,請提供標準報價。

+0

這是否運行?您將從NULL讀取內存,我看不到這可以如何工作 – Eric 2013-05-03 15:53:11

+2

太早打開關閉按鈕。這是關於'memcmp',而不是'memcpy'。投票重新開放。 – 2013-05-03 15:54:05

+3

@Eric如果'count'參數爲'0',指針不應該被取消引用。但這就是說,問題是問標準是否能保證這種行爲,我不知道答案。 – Praetorian 2013-05-03 15:54:08

回答

30

特別是,以下是明確定義的,還是表現出未定義的行爲?

這是未定義的。 C99 7.21.1/2說,有關的所有字符串函數:

除非另有明確在特定的功能本節描述中所述 ,在這樣的稱呼指針參數 仍應具有有效值

和7.21.4.1中memcmp的描述沒有明確指出。

這與C和C++有什麼不同嗎?

不,C++將其C語言定義爲C庫函數,並且沒有任何關於memcmp的特殊說法。

+0

第二個引用的相關性通過前導語境變得更加清晰:在聲明爲size_t n的參數指定函數的數組長度的情況下,在調用該函數時,n的值可以爲零。除非另有明確規定......' – user295691 2013-05-03 18:17:40

+0

已接受,謝謝。還有一個問題:指針的「有效值」是否真的意味着「非空值」?是否有這樣的報價? – avakar 2013-05-04 12:12:24

+2

@avakar:是的,如果你真的想遵循標準一路走到最後,那麼我的引用引用7.1.4定義了「有效」,並且特別包含了「空指針」庫函數的「無效」值的示例。 – 2013-05-05 17:06:37