当使用不同的格式说明符传递char指针时,printf如何确定要打印的内容?

时间:2016-08-01 10:38:27

标签: c string printf format-specifiers

#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”将给出它的地址,因为它是一个 指针;
  • 它需要一个字符串,“s”会给它一个值。

或者这是否意味着“s”有责任为printf提供适当的价值?但它不是一个对象,单个价值如何知道一些自我行动?

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

在您的代码中,

 printf("%d\n",pa);
 printf("%s\n",pa);

 printf("%d\n",s);

在您传递错误类型的参数时调用undefined behavior。永远不要依赖输出。

答案 1 :(得分:0)

字段格式化程序%d表示&#34;将此变量的值转换为十进制表示&#34;。所以它总是输出一个数字,无论是正常值还是由apointer携带的地址。

字段格式化程序%s表示&#34;显示该地址的字节,直到您遇到空值。因此,如果变量没有保留允许的地址,它会输出一些长度的字符串或引发内存错误。