#include <stdio.h>
int main(void){
int a = 6;
int *pa;
pa = &a;
printf("%d\n",*pa); //6
printf("%d\n",pa); //1575619476
printf("%s\n",pa); //nothing, a empty line
char *s="test";
printf("%d\n",s); //183013286
printf("%s\n",s); //test
}
代码很简单, pa是一个int类型的指针,我们打印pa,我们得到一个内存地址,我们打印* pa,我们得到它的值;
但是当涉及到char类型的指针时,事情变得有趣,似乎printf可以获取它需要输出的相应类型,
或者这是否意味着“s”有责任为printf提供适当的价值?但它不是一个对象,单个价值如何知道一些自我行动?
这里发生了什么?
答案 0 :(得分:3)
在您的代码中,
printf("%d\n",pa);
printf("%s\n",pa);
和
printf("%d\n",s);
在您传递错误类型的参数时调用undefined behavior。永远不要依赖输出。
答案 1 :(得分:0)
字段格式化程序%d表示&#34;将此变量的值转换为十进制表示&#34;。所以它总是输出一个数字,无论是正常值还是由apointer携带的地址。
字段格式化程序%s表示&#34;显示该地址的字节,直到您遇到空值。因此,如果变量没有保留允许的地址,它会输出一些长度的字符串或引发内存错误。