2015-02-09 58 views
2

如果我用C具有低于串:&string_name或string_name%s的打印字符串用C

char s[]="Question"; 

然后我指出的是,下面的prtintf正确打印字符串中终端。

1.

printf("%s\n",s); 

2.

printf("%s\n",&s); 

这是打印字符串中。如果两者都是相同的一个正确的方法,那么什么是遵循的惯例? 1或2?

谢谢。

+3

第二个是未定义的行为。第一个是正确的。 [C-faq 12.12b](http://c-faq.com/stdio/scanf1a.html) – 2015-02-09 02:04:59

+1

[为什么scanf不需要字符串的&符号,并且在printf中(在C中)也能正常工作? ](http://stackoverflow.com/questions/1931850/why-doesnt-scanf-need-an-ampersand-for-strings-and-also-works-fine-in-printf-i) – P0W 2015-02-09 02:17:00

+0

数组的名称,在C中,降级到阵列的地址。所以printf(“%s”,数组)是正确的。使用printf(“%s”,&array);是说打印数组的地址的地址,这是没有定义的,可能会导致一个seg故障事件。 – user3629249 2015-02-09 04:07:07

回答

5
char s[]="Question"; 
printf("%s\n",&s); 

是不确定的行为,因为

§7.21.6.1/ 8转换说明符及其含义如下:

[...]

小号                   如果没有升 长度改性剂的存在,该参数应的指针的                       的阵列 初始元件字符类型。

§7.21.6.1/ 9 [...]如果任何参数不是 相应转换规范的正确类型,则行为是未定义的。

s在这种情况下会衰减到指针类型。由于&会生成一个指针,因此您传递给printf的类型实际上是指向指针的指针。

0

第一个是正确的,对于第二个你应该从你的编译器得到一个警告,因为它是UB,是这样的:

[Warning] format '%s' expects argument of type 'char *'