如果我在C中有以下字符串:
char s[]="Question";
Run Code Online (Sandbox Code Playgroud)
然后我注意到下面的两个prtintf都在终端中正确打印了字符串.
1.
printf("%s\n",s);
Run Code Online (Sandbox Code Playgroud)
2.
printf("%s\n",&s);
Run Code Online (Sandbox Code Playgroud)
这是在C中打印字符串的正确方法.如果两者都相同,那么遵循的约定是什么?1还是2?
谢谢.
小智 5
char s[]="Question";
printf("%s\n",&s);
Run Code Online (Sandbox Code Playgroud)
是未定义的行为因为,
§7.21.6.1/ 8转换说明符及其含义如下:
[...]
■如果不存在l length修饰符,则参数应为指向字符类型数组的初始元素的指针.
§7.21.6.1/ 9 [...]如果任何参数不是相应转换规范的正确类型,则行为未定义.
s在此上下文中将衰减为指针类型.由于&产生指针,您传递的类型printf实际上是指向指针的指针.