如果我在C中有以下字符串:
char s[]="Question";
然后我注意到以下两个prtintf都在终端中正确打印了字符串。
1
printf("%s\n",s);
2
printf("%s\n",&s);
这是在C中打印字符串的正确方法。如果两者都相同,那么遵循的约定是什么? 1还是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 *'