#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??
}
转换说明符s
用于输出字符串(或其部分(:以零字符' '
结尾的字符序列。
为了输出对象的地址,有转换说明符p
。
这是一个示范节目。
#include <stdio.h>
int main(void)
{
char s[] = "Hello";
printf( "%sn", s );
printf( "%pn", ( void * )s );
return 0;
}
程序输出可能看起来像
Hello
0x7ffc86fe4372
至于问题中的代码,它有未定义的行为,因为表达式&var
不指向字符串,因为变量var
的定义类似
char var = 'z';
如果你想输出它的地址,那么你可以把它作为
printf("[buf]: %p n", ( void * )&var);
%s
告诉printf
接受指向字符串第一个字符的指针,并打印该字符串,直到指示其结束的空字符。由于您传递了单个字符的地址,printf
会打印该地址,并继续在内存中查找更多要打印的字符,直到找到一个包含零的字节。对于%s
,当您传递指向单个字符的指针,而不是以null字符结束的字符数组时,C标准不定义该行为。
要打印地址,请使用%p
并将指针转换为void *
:
printf("%pn", (void *) &var);