为何使用%s格式符输出char类型变量的地址时打印值而非地址,且输出内容为变量值后接乱码?
关于C语言printf用%s输出char变量地址的问题解析
这是个很常见的C语言初学者误区,我来给你一步步讲明白:
为什么%s打印的是变量值而非地址?
首先得搞清楚printf的%s格式符的核心作用:它专门用来输出以空字符'\0'结尾的字符串,接收的参数是一个char*类型的指针,指向字符串的起始位置。
当你写printf("[buf]: %s \n", &var);时,&var是char类型变量var的地址,类型刚好是char*——但这时候printf并不会把它当成“地址”来打印,而是会从这个地址开始,逐个输出内存中的字符,直到遇到'\0'才停止工作。
如果你的需求是打印变量的地址,应该用%p格式符,并且要把指针强制转换为void*类型,比如:
printf("var的地址是: %p \n", (void*)&var);
为什么输出是'z'加一串乱码?
先看你的测试代码:
#include <stdio.h> int main(void) { char var = 'z'; printf("[buf]: %s \n", &var); // 输出结果为z~~~~~,但只有第一个字符是z,这是为什么? }
var是单个char变量,它只在内存中占据1个字节,存储了字符'z'(对应ASCII码0x7A)。但%s的逻辑是从传入的地址开始持续读取字符,直到碰到'\0'(ASCII码0x00)才会停下。
而var后面的内存区域是栈上的未初始化空间(或者是其他变量的残留数据),这些都是没有意义的随机垃圾值。所以你看到的z~~~~~,其实是'z'加上后续内存里的随机字符,直到某个位置刚好出现'\0',printf才会停止输出。
这种行为本质上是访问了超出变量范围的内存,属于C语言里的未定义行为——不同环境下输出的乱码可能不一样,极端情况下甚至可能导致程序崩溃。
总结一下
- 使用
%s时,必须确保传入的指针指向一个以'\0'结尾的合法字符串; - 打印变量地址请用
%p格式符,并配合void*类型转换; - 单个
char变量不是字符串,绝对不要用%s去打印它的地址。
内容的提问来源于stack exchange,提问作者J.
相关产品推荐
相关产品推荐

