打印空字符串是否被定义?

3

这段代码是否有明确定义的行为?

char *str = NULL;
printf("%s\n",str);

针对 C++ (98/03 和 11) 和 C (99) 标准的上下文。


3
抱歉听起来有些严厉,但是:如果你必须问,那么你可能做错了。 - Mr Lister
不存在所谓的“空字符串”。实际上,一开始几乎不存在所谓的“字符串”(除非你当然是指std::string)。 - Kerrek SB
从标准来看:“字符串是由第一个空字符终止并包括在内的连续字符序列。”但是没错,我之前对“NULL字符串”的表述过于简化了。 - Šimon Tóth
3个回答

4

C中的未定义行为

(C99, 7.19.6.1p8) "如果没有l长度修饰符,则参数应该是指向字符类型数组初始元素的指针。"

在某些编译器/ libc中,它会打印(null),而在其他一些编译器中,它会导致段错误。

(注意:在C中,违反不是约束的“应该”是未定义的行为,请参见标准C中的4.p2“一致性”)


@ThiefMaster,这将导致未定义的行为,因为在标准中,“shall”的含义通常会产生这样的结果,特别是在C标准中。请参见开头的“一致性”部分。 - Pascal Cuoq
如果您能找到C++标准中相应的章节,那就太好了。 - Šimon Tóth
1
@Let_Me_Be:C++标准通常不会重新定义C函数,它会首先引用C标准来解决这个问题。 - Matthieu M.
@MatthieuM。哦,是的,你说得对。该死,我需要更经常地打开标准 :-D 谢谢 - Šimon Tóth

1

是的。

printf会解引用指针str,而解引用空指针是未定义行为。


printf是否将指针std解引用视为标准的一部分? - Luchian Grigore
1
@codaddict,你的意思不是回答“不”吗? - Mr Lister

-1
在C语言中,对空指针进行解引用会产生未定义的行为,可能会导致灾难性后果。然而,大多数实现只是停止执行相关程序,通常会出现分段错误。
请查看this

1
@MS 因为它完全不相关。 - Šimon Tóth
@Let_Me_Be,您能否详细说明一下您认为这是“完全无关”的原因? - Sangeeth Saravanaraj
@SangeethSaravanaraj 因为问题中没有涉及到解引用。问题实际上是标准是否要求 printf 在解引用之前检查 NULL(就像在 glibc 中当前实现的那样)。 - Šimon Tóth
@Let_Me_Be 但它并不是!它直接回答了问题!唯一的问题是,大多数我尝试过的编译器会打印“(null)”而不是崩溃,但除此之外,这个答案没有任何不相关的地方。 - Mr Lister
@MrLister,而标准要求的地方正是这个问题的关键所在。 - Šimon Tóth
@Let_Me_Be,“问题实际上是标准是否要求printf在解除引用之前检查NULL”——这个问题在哪里提到了?!OP的问题是当str为NULL时,“printf(“%s \ n”,str);”是否有任何未定义的行为!在我看来,你对-1的辩解是不合理的!无论如何,祝你有愉快的一天! :) - Sangeeth Saravanaraj

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接