当我使用带有%s和%c的printf时,为什么打印的char会改变?

Kor*_*gay 0 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));

}
Run Code Online (Sandbox Code Playgroud)

我得到的输出是:

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
Run Code Online (Sandbox Code Playgroud)

当我将最后一个语句更改为:

printf("%c",*(&p));
Run Code Online (Sandbox Code Playgroud)

打印的最后一行是:

6
Run Code Online (Sandbox Code Playgroud)

代替

koraytugay
Run Code Online (Sandbox Code Playgroud)

但为什么?我期待它会打印出来

k
Run Code Online (Sandbox Code Playgroud)

Sou*_*osh 9

%c格式说明符需要一个类型的argumnet char.

在您的代码中,*(&p)是类型char *.使用%c打印导致不确定的行为.

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

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


Iha*_*imi 5

它没有打印,k因为它期待a char并且你char *很可能通过了

printf("%c", **(&p));
Run Code Online (Sandbox Code Playgroud)

将打印k.

类型&pchar **因为它创建了一个地址为的指针p,所以*(&p)完全相同p,因此要打印*(&p)你需要说明"%s"符.

如果使用说明"%c"符并将*(&p)其计算为整数,则无法预测将要打印的内容,因为它将取决于指针中存储的值.