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

x86平台指针大小与C++程序输出乱码问题探究

为什么这段C++代码输出了额外的垃圾字符?

先来看你提供的代码:

#include <iostream> 
#define SIZE 2 
int main(int argc, char** argv) { 
    char w = 'a'; 
    char *array[SIZE]; 
    array[0] = &w; 
    std::cout << *array << std::endl; 
    system("PAUSE"); 
    return(0); 
}

你观察到输出是a╠╠╠╠┴Kôè∞≈5«,┌而不是预期的a,你的猜测其实不对——这和x86平台下指针的大小(4字节)没有关系,真正的问题出在**std::cout对char*的处理逻辑**上。

核心原因:C风格字符串需要终止符

当你用std::cout输出一个char*类型的值时,它会默认把这个指针当作C风格字符串来处理。C风格字符串的规则是:从指针指向的地址开始,逐个输出字符,直到遇到\0(空字符,ASCII值为0)才停止。

而你的代码里,w是一个单独的char变量,只存储了'a',它后面的内存区域是栈上的未初始化数据(也就是所谓的“垃圾数据”)。std::cout从&w的地址开始输出,打印完'a'之后,找不到\0终止符,就会继续输出后面栈里的随机字节,直到碰巧遇到某个内存位置的值是\0为止,这就是你看到那些乱码的原因。

解决方法

有两种简单的方式可以修正这个问题:

  • 输出单个字符而非字符串
    如果你只是想打印w的值,直接解引用到单个char即可:

    std::cout << *array[0] << std::endl;
    

    这里array[0]是指向w的指针,*array[0]就是'a'本身,std::cout会直接输出这个单个字符,不需要找终止符。

  • 使用带终止符的字符数组
    如果你确实想把它当作字符串来输出,把w定义成字符数组,这样编译器会自动在末尾添加\0终止符:

    char w[] = "a"; // 等价于 {'a', '\0'}
    

    这时array[0] = w;(w会自动退化为指向数组首元素的指针),std::cout输出时遇到\0就会停止,只会打印a。

内容的提问来源于stack exchange,提问作者Tracy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:34:49