[英]What happens exactly when you pass by value pointer that is already allocated?
[英]In C, what exactly happens when you pass a NULL pointer to strcmp()?
我已经读过以下结果导致未定义的行为。
strcmp(foo, NULL);
但究竟发生了什么“在引擎盖下”,可以这么说呢? foo
与垃圾数据相比? 是否取消引用NULL
? 导致“未定义行为”的细节是什么?
这取决于实现,可以自由地假设您的参数有效(在这种情况下不为null)。 该行为可以或可以不是从执行到执行,或从一个实现/平台到另一个实现/平台可再现。
C11在7.1.4“库函数的使用”中非常清楚:
除非在以下详细说明中另有明确说明,否则以下每个陈述均适用:如果函数的参数具有无效值(例如[...]空指针[...])[...],行为未定义。
7.24.4中对strcmp
的描述没有另外说明,因此行为确实未定义。
这是glibc中strcmp的当前实现:
/* Compare S1 and S2, returning less than, equal to or
greater than zero if S1 is lexicographically less than,
equal to or greater than S2. */
int
strcmp (p1, p2)
const char *p1;
const char *p2;
{
const unsigned char *s1 = (const unsigned char *) p1;
const unsigned char *s2 = (const unsigned char *) p2;
unsigned char c1, c2;
do
{
c1 = (unsigned char) *s1++;
c2 = (unsigned char) *s2++;
if (c1 == '\0')
return c1 - c2;
}
while (c1 == c2);
return c1 - c2;
}
你传递两个指针,strcmp取消引用它们的内容并进行比较,直到它遇到差异或空字符。 失败发生在不同的抽象级别,strcmp本身就没有失败。 许多系统在取消引用NULL指针时生成SIGSEGV标志,但这不是必需的。
请注意,ISO标准没有定义很多东西,将实现细节留给实现。 在ISO C级别,您的示例没有任何问题,但结果不能保证是可预测的。 (并且除非您查阅基础系统的规则并且他们另有说明,否则不保证实际测试的准确性和可重复性。
当我们谈论抽象层次时,我们不能问“如果”,因为规则是明确的并且说“不要这样做,行为没有在这里定义”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.