& string_name或string_name for%s在C中打印字符串

时间:2015-02-09 02:02:17

标签: c string printf

如果我在C中有以下字符串:

char s[]="Question";

然后我注意到以下两个prtintf都在终端中正确打印了字符串。

1

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

2

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

这是在C中打印字符串的正确方法。如果两者都相同,那么遵循的约定是什么? 1还是2?

感谢。

2 个答案:

答案 0 :(得分:5)

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

是未定义的行为,因为,

  

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

     

[...]

     

s如果没有l   如果存在长度修饰符,则参数应为指向的   字符类型数组的初始元素。

     

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

在此上下文中,

s将衰减为指针类型。由于&产生一个指针,因此传递给printf的类型实际上是指向指针的指针。

答案 1 :(得分:0)

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

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