如果我用C具有低于串:&string_name或string_name%s的打印字符串用C
char s[]="Question";
然后我指出的是,下面的prtintf正确打印字符串中终端。
1.
printf("%s\n",s);
2.
printf("%s\n",&s);
这是打印字符串中。如果两者都是相同的一个正确的方法,那么什么是遵循的惯例? 1或2?
谢谢。
如果我用C具有低于串:&string_name或string_name%s的打印字符串用C
char s[]="Question";
然后我指出的是,下面的prtintf正确打印字符串中终端。
1.
printf("%s\n",s);
2.
printf("%s\n",&s);
这是打印字符串中。如果两者都是相同的一个正确的方法,那么什么是遵循的惯例? 1或2?
谢谢。
char s[]="Question";
printf("%s\n",&s);
是不确定的行为,因为
§7.21.6.1/ 8转换说明符及其含义如下:
[...]
小号 如果没有升 长度改性剂的存在,该参数应的指针的 的阵列 初始元件字符类型。
§7.21.6.1/ 9 [...]如果任何参数不是 相应转换规范的正确类型,则行为是未定义的。
s
在这种情况下会衰减到指针类型。由于&
会生成一个指针,因此您传递给printf
的类型实际上是指向指针的指针。
第一个是正确的,对于第二个你应该从你的编译器得到一个警告,因为它是UB,是这样的:
[Warning] format '%s' expects argument of type 'char *'
第二个是未定义的行为。第一个是正确的。 [C-faq 12.12b](http://c-faq.com/stdio/scanf1a.html) – 2015-02-09 02:04:59
[为什么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
数组的名称,在C中,降级到阵列的地址。所以printf(“%s”,数组)是正确的。使用printf(“%s”,&array);是说打印数组的地址的地址,这是没有定义的,可能会导致一个seg故障事件。 – user3629249 2015-02-09 04:07:07