2013-05-03 427 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