为什么当我将 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
?
它不打印 k
因为它期待 char
而你通过了 char *
所以可能
printf("%c", **(&p));
将打印 k
.
&p
的类型是char **
,因为它创建了一个地址为p
的指针,所以*(&p)
和p
完全一样,因此要打印 *(&p)
您需要 "%s"
说明符。
如果将 "%c"
说明符与 *(&p)
一起使用,它会被计算为整数,因此您无法预测将要打印的内容,因为它取决于存储在指针。
%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.
这是我的代码:
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
?
它不打印 k
因为它期待 char
而你通过了 char *
所以可能
printf("%c", **(&p));
将打印 k
.
&p
的类型是char **
,因为它创建了一个地址为p
的指针,所以*(&p)
和p
完全一样,因此要打印 *(&p)
您需要 "%s"
说明符。
如果将 "%c"
说明符与 *(&p)
一起使用,它会被计算为整数,因此您无法预测将要打印的内容,因为它取决于存储在指针。
%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.