0
#include <stdio.h>

int main(void)
{

    char var = 'z';

    printf("[buf]: %s \n", &var); // the output is z~~~~~, but the first char of output is only z. why??
}
4

2 回答 2

2

转换说明符s旨在输出字符串(或其部分):由零字符终止的字符序列'\0'

要输出对象的地址,有转换说明符p

这是一个演示程序。

#include <stdio.h>

int main(void) 
{
    char s[] = "Hello";
    
    printf( "%s\n", s );
    printf( "%p\n", ( void * )s );
    
    return 0;
}

程序输出可能看起来像

Hello
0x7ffc86fe4372

至于您问题中的代码,它具有未定义的行为,因为表达式&var未指向字符串,因为变量var的定义如下

char var = 'z';

如果你想输出它的地址,那么你可以这样做

printf("[buf]: %p \n", ( void * )&var);
于 2021-05-09T11:49:14.753 回答
0

%s告诉printf接受指向字符串第一个字符的指针并打印该字符串,直到表示其结束的空字符。由于您传递了单个字符的地址,因此printf打印该地址并继续在内存中查找要打印的更多字符,直到找到包含零的字节。对于%s,当您传递一个指向单个字符的指针,而不是一个以空字符终止的字符数组时,C 标准没有定义该行为。

要打印地址,请使用%p指针并将其转换为void *

printf("%p\n", (void *) &var);
于 2021-05-09T12:20:55.997 回答