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

sps*_*sps 2 c string printf

如果我在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实际上是指向指针的指针.