[英]Why does the printed char change when I use printf with %s and %c?
这是我的代码:
int main(){
char *p = "koraytugay";
printf("%s%i byte(s).\n", "Size of variable p:" ,sizeof(p));
printf("%s%i byte(s).\n\n", "Size of what p points to:" ,sizeof(*p));
char t[] = "koraytugay";
printf("%s%i byte(s).\n", "Size of variable t:" ,sizeof(t));
printf("%s%i byte(s).\n\n", "Size of what t points to:" ,sizeof(*t));
printf("%s%c\n", "Printing p[3]: ", p[3]);
printf("%s%c\n", "Printing t[3]: ", t[3]);
printf("%s",*(&p));
}
我得到的输出是:
Size of variable p:8 byte(s).
Size of what p points to:1 byte(s).
Size of variable t:11 byte(s).
Size of what t points to:1 byte(s).
Printing p[3]: a
Printing t[3]: a
koraytugay
当我将最后一条语句更改为:
printf("%c",*(&p));
最后打印的行将是:
6
代替
koraytugay
但为什么? 我希望它会打印
k
?
%c
格式说明符期望使用char
类型的argumnet。
在您的代码中, *(&p)
的类型为char *
。 使用%c
打印会导致未定义的行为 。
参考:从第7.21.6.1章, C11
标准,第9段开始,
如果转换规范无效,则行为未定义。 如果任何参数都不是相应转换规范的正确类型,则行为未定义。
它不会打印k
因为它期待一个char
并且您通过了char *
所以很可能
printf("%c", **(&p));
将打印k
。
该类型的&p
是char **
,因为它会创建的地址的指针p
,所以*(&p)
是完全一样p
,因此打印*(&p)
你所需要的"%s"
符。
如果在*(&p)
使用"%c"
说明符,则将其视为整数,因此您将无法预测将要打印的内容,因为它取决于指针中存储的值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.