You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:29:59