【问题标题】:Is printing NULL string defined?是否定义了打印 NULL 字符串?
【发布时间】:2012-01-10 12:47:12
【问题描述】:

此代码是否已定义行为?

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

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

【问题讨论】:

  • 很抱歉听起来如此刺耳,但是:如果你不得不问,你可能做错了。
  • 没有“空字符串”这样的东西。几乎没有以“字符串”开头的东西(当然,除非您的意思是std::string)。
  • @KerrekSB 来自标准:“一个 string 是一个连续的字符序列,以第一个空字符终止并包括第一个空字符。” 但是,是的, NULL 字符串对我来说过于简单了。

标签: c++ c standards undefined-behavior


【解决方案1】:

C 中未定义的行为

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

对于一些编译器/libc,它会打印 (null),而对于其他一些编译器,它会出现段错误。

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

【讨论】:

  • @ThiefMaster 由于“应该”在一般标准中的含义,特别是在 C 标准中,它会导致未定义的行为。请参阅开头的“一致性”部分。
  • 如果你也能在C++标准中找到相应的章节,那就太好了。
  • @Let_Me_Be:C++ 标准通常不会重新定义 C 函数,因此它从引用 C 标准开始。
  • @MatthieuM。哦,是的,你是对的。该死,我需要更频繁地打开标准:-D Thx
【解决方案2】:

是的。

printf 将取消引用指针 str 并且取消引用 NULL 指针是 UB。

【讨论】:

  • printf 是否引用标准的指针 std 部分?
  • @codaddict 你不是说“否”作为问题的答案吗?
【解决方案3】:

取消引用C 中的null 指针会产生undefined behavior,这可能是灾难性的。然而,大多数实现只是简单地停止相关程序的执行,通常会出现分段错误。

请查看this

【讨论】:

  • @MS 因为完全不相关。
  • @Let_Me_Be 你能详细说明你认为这是completely irrelevant的原因吗?
  • @SangeethSaravanaraj 因为问题中不涉及取消引用。问题实际上是标准是否要求printf 在解除引用之前必须检查NULL(因为它目前在glibc 中实现)。
  • @Let_Me_Be 但事实并非如此!直接回答了这个问题!唯一的问题是,对于我尝试过的大多数编译器,它会打印“(null)”而不是崩溃,但除此之外,这个答案没有什么不相关的。
  • @MrLister 标准所要求的正是这个问题的意义所在。
猜你喜欢
  • 2021-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多