C语言字符串解引用后再引用行为异常:printf(&c)输出不符预期原因
你的代码为什么输出乱码?咱们来拆解清楚
先看你写的代码:
#include <stdio.h> int main(){ char *p = "abc"; char c = *p; printf(&c); // 这里就是问题的核心啦 return 0; }
为啥会输出a%QV这种奇怪的内容?
printf函数的第一个参数,要求必须是指向以空字符\0结尾的字符串的指针。它的工作逻辑是从这个指针指向的地址开始,挨个读字符输出,直到碰到\0才会停下来。
你现在传给printf的是&c——也就是单个字符变量c的地址。c里面确实存了'a',但c只是一个单独的char变量,它后面的内存空间里的内容是完全随机的(栈上的残留数据)。printf不知道这一点,会一直顺着内存读下去,直到碰巧遇到一个\0才停止,所以你就看到a后面跟着一堆乱码了。
为啥预期的abc没出来?
你可能误以为&c和原字符串"abc"有关联?其实完全没有:char c = *p;这行代码只是把p指向的第一个字符'a'复制到了c这个独立变量里,c和原字符串"abc"没有任何绑定关系。原字符串的地址还是存在p里,&c只是c自己的地址,和"abc"的地址八竿子打不着。
怎么改才能输出abc?
最简单的两种正确写法:
- 直接把原字符串指针传给
printf:printf(p); // 或者更规范的写法是 printf("%s", p); 或者直接写 printf("abc"); - 如果你非要绕一下(其实没必要哈),那也得保证传给
printf的是一个合法的、以\0结尾的字符串指针,但c是单个字符,这条路走不通,直接用原指针最靠谱。
另外提一句:哪怕你写成printf("%s", &c)也不行,因为&c指向的不是合法的字符串,照样会读随机内存出乱码。
内容的提问来源于stack exchange,提问作者extremeaxe5
相关产品推荐
相关产品推荐

