【问题标题】:Why does the printed char change when I use printf with %s and %c?为什么当我将 printf 与 %s 和 %c 一起使用时,打印的字符会发生变化?
【发布时间】:2015-03-16 12:17:07
【问题描述】:

这是我的代码:

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 printf format-specifiers


    【解决方案1】:

    %c 格式说明符需要 char 类型的 argumnet。

    在您的代码中,*(&p) 的类型为 char *。使用%c 打印导致undefined behaviour

    参考:来自第 7.21.6.1 章,C11 标准,第 9 段,

    如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。

    【讨论】:

    • 谢谢,很好的回答。能否给个参考链接?
    • @KorayTugay 不客气。我参考了C11 标准文档。该标准的在线草案版本可通过here获得。
    【解决方案2】:

    它不打印k,因为它期待char,而您可能传递了char *

    printf("%c", **(&p));
    

    将打印k

    &p 的类型是char **,因为它创建了一个地址为p 的指针,所以*(&p)p 完全相同,因此打印*(&p) 你需要@987654332 @ 说明符。

    如果您将"%c" 说明符与*(&p) 一起使用,它会被评估为整数,因此您无法预测将要打印的内容,因为它将取决于存储在指针中的值是什么。

    【讨论】:

    • @iharob 你确定:&p 的类型是 char ** 吗? &p 的类型不是很长吗?
    • 不,它是char **,你可能会感到困惑的是它是一个指针,但指针不是long 类型,在c 中你可以从void * 转换为任何指针类型和从任何指针类型到void。指针存储作为地址的值。但它不是long
    猜你喜欢
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2019-11-30
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多