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

标签 c printf format-specifiers

这是我的代码:

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 类型的参数。

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

引用:来自第 7.21.6.1 章,C11 标准,第 9 段,

If a conversion specification is invalid, the behavior is undefined. If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

关于c - 为什么当我将 printf 与 %s 和 %c 一起使用时,打印的字符会发生变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29076618/

相关文章:

c - printf 在打印时如何知道 strtok 标记的结尾?

java - 如何在java printf中保留数字符号?

c - 在宏中将格式说明符传递给 printf

c - 如何让 MinGW GCC 识别 size_t 的 %zu 格式说明符?

c - header 相互使用结构和枚举?

c - 在 C 中从类型 void * 分配给类型时出现错误不兼容类型

c - PowerPC 内联程序集 : Load C Value into Register

c - 如何使用基于表格的CRC-16码?

perl - 为什么 Perl 的 sprintf 不能正确舍入 float ?

c - 两个格式说明符但只有一个参数