2012-01-10 39 views
3

此代码是否定义了行为?是否定义了打印NULL字符串?

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

在C++(98/03和11)和C(99)标准的背景下。

+3

很抱歉说得那么苛刻,但如果你要问,你可能就错了。 – 2012-01-10 13:08:38

+0

有没有这样的事情作为“空字符串”。开头几乎没有像“字符串”这样的东西(当然,除非你的意思是'std :: string')。 – 2012-01-10 13:53:14

+0

@KerrekSB从标准:_“A **字符串**是一个连续的字符序列,并且包括第一个空值 字符。”但是,NULL字符串对我来说太简单了。 – 2012-01-10 13:59:54

回答

4
用C

未定义行为

(C99,7.19.6.1p8)“■如果没有升长度改性剂的存在,则参数 应是指向字符 类型的数组的初始元素“。

与一些编译器/ libc它打印(null)和其他一些segfaults。

(注:用C违反shall不是一个约束是不确定的行为,请参阅标准C 4.p2“一致性”)

+0

@ThiefMaster由于一般标准和特别是C标准中“shall”的含义,导致未定义的行为。请参阅开始处的“一致性”部分。 – 2012-01-10 12:55:37

+0

如果您还可以在C++标准中找到相应的章节,那就太棒了。 – 2012-01-10 12:58:17

+1

@Let_Me_Be:C++标准通常不会重新定义C函数,因为这个原因,它通过引用C标准开始。 – 2012-01-10 13:06:08

1

是。

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

+0

是'printf'取消标准指针标准部分的指针吗? – 2012-01-10 12:56:10

+1

@codaddict你不是指“否”作为问题的答案吗? – 2012-01-10 13:12:05

-1

取消参考null指针C产生undefined behavior,这可能是灾难性的。但是,大多数实现只是停止执行有问题的程序,通常是出现分段错误。

请检查this

+0

为什么-1这个? – 2012-01-10 13:02:12

+1

@MS因为它是完全不相关的。 – 2012-01-10 13:03:20

+0

@Let_Me_Be请您详细说明您为什么认为这是“完全不相关”的原因? – 2012-01-10 13:07:26