你是不是有过这样的经历?写C/C++的时候,出现这种奇怪的字符串,比如出现如下字符
然后还出现这种字符串
你回头一看,最终发现了问题,肯定是下面这两种问题。
出现’烫’的时候,是你声明了一个char数组,但是没有赋值任何数据
char a[2];
出现’屯’,是你声明了char指针,也没有给它任何数据
char * a = new char[2];
并且,你还是用的编辑器是vs,还是debug模式,我说的对不对?
问题出现了,也知道怎么出现的,应该想想为什么出现’烫’,而没有出现’汤’,为什么出现"屯",没有出现”吨“
好,开始说说为什么
准备工作:vs2015,win10
创建一个C++控制台程序,输入以下代码
#include "stdafx.h"
int main(int ArgCount, char **Args)
{
char a[2];
return 0;
}
好了,准备完毕,开始
在上面代码第五行上打断点,F5跑起来,把鼠标放到a上,看看a的内存地址是什么
我的地址是0x008ffea8
然后把vs工具栏:调试->窗口->内存->内存1,打开,然后把刚才得到的0x008ffea8地址,输入到地址栏里
操作完上述流程后,看见没有?下面的内容变了,看地址0x008ffea8处的内容,是cc cc cc cc…这个内容就是目前a里的内容。
为啥是cc呢?你又没有给它填充过cc
其实这个填充cc和编译器行为有关系,当声明一个数组还未初始化的时候,编译器会给你自动填充cc
正好,cccc在中文编码中,就是’烫’ 字。
同理,再看看指针声明,把数组改成指针
#include "stdafx.h"
int main(int ArgCount, char **Args)
{
char * a = new char[2];
return 0;
}
现在内存中的内容是cd cd ,这同样也是编译程序自动填充的内容
同样正好,cdcd在中文编码中,就是’屯’ 字。
就这样,就是这个意思,出现’烫’和’屯’,并非出现的乱码,内存中就是存的就是这些,所以,写程序的时候,定义完变量,最好给他填充一下,最简单的,如果是数组的话,给他赋值个花括号,
char a[2] = {};
如果是指针的话,用memset给他填充一下
memset(a, 0, 2);