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
相关产品推荐
相关产品推荐

