我想知道为什么 &a(Data type: char) 使用 %s 打印为值而不是地址
I wonder why &a(Data type: char) is printed as value not address, using %s
#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
旨在输出字符串(或其部分):以零字符终止的字符序列 '[=15=]'
。
要输出对象的地址,有转换说明符 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);
%s
告诉 printf
接受指向字符串第一个字符的指针并打印该字符串,直到指示其结尾的空字符为止。由于您传递了单个字符的地址,因此 printf
会打印该地址并继续在内存中查找要打印的更多字符,直到找到包含零的字节。对于 %s
,当您传递指向单个字符的指针,而不是指向以空字符结尾的字符数组时,C 标准未定义该行为。
要打印地址,请使用 %p
并将指针转换为 void *
:
printf("%p\n", (void *) &var);
#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
旨在输出字符串(或其部分):以零字符终止的字符序列 '[=15=]'
。
要输出对象的地址,有转换说明符 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);
%s
告诉 printf
接受指向字符串第一个字符的指针并打印该字符串,直到指示其结尾的空字符为止。由于您传递了单个字符的地址,因此 printf
会打印该地址并继续在内存中查找要打印的更多字符,直到找到包含零的字节。对于 %s
,当您传递指向单个字符的指针,而不是指向以空字符结尾的字符数组时,C 标准未定义该行为。
要打印地址,请使用 %p
并将指针转换为 void *
:
printf("%p\n", (void *) &var);