繁体   English   中英

当我将printf与%s和%c一起使用时,为什么打印的字符会改变?

[英]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

该类型的&pchar ** ,因为它会创建的地址的指针p ,所以*(&p)是完全一样p ,因此打印*(&p)你所需要的"%s"符。

如果在*(&p)使用"%c"说明符,则将其视为整数,因此您将无法预测将要打印的内容,因为它取决于指针中存储的值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM