char ch[][]与char *ch[]是否等价?为何C++代码运行结果不同?
为啥你的两个字符数组输出结果不一样?
嘿,这个问题其实是C/C++里字符串和字符数组最容易踩的坑之一,我来给你掰扯清楚~
先看第一个二维字符数组 char ch[3][2]
- 你定义的是一个3行2列的纯字符数组,每个位置只存单个字符:
ch[0]是{'1','2'},ch[1]是{'3','4'},ch[2]是{'5','6'}。 - 但这里有个关键问题:你没有给它添加字符串结束符
'\0'。当你用cout << ch[0]的时候,C++会把ch[0]当成一个C风格字符串的指针来处理——它会从指针指向的位置开始逐个输出字符,直到碰到'\0'才会停止。 - 你的数组里根本没有
'\0',所以cout会“越界”读取后面的内存,把ch[1]、ch[2]里的字符也一并输出,于是就出现了123456的结果(这已经算运气好的,要是后面内存里有其他乱码,输出会更奇怪)。
再看第二个指针数组 char *cha[3]
- 这是一个存放char指针的数组,每个元素指向的是一个字符串常量(比如
cha[0]指向"12")。 - 这里的核心区别是:C++中用双引号
""定义的字符串常量,会自动在末尾添加'\0'作为结束标记。所以当你用cout << cha[0]的时候,cout读到'\0'就立刻停止输出,自然只会显示12。
验证一下?
如果你想让第一个数组也输出12,可以给它加上结束符:
#include <iostream> using namespace std; int main() { // 把列数改成3,给每个子数组加'\0' char ch[3][3] = {{'1','2','\0'},{'3','4','\0'},{'5','6','\0'}}; cout<<ch[0]<<endl; // 现在会输出12 char *cha[3] = {"12","34","56"}; cout<<cha[0]; return 0; }
或者用cout.write()指定输出长度,也能避免越界:
cout.write(ch[0], 2) << endl; // 只输出前2个字符,结果是12
内容的提问来源于stack exchange,提问作者saqib
相关产品推荐
相关产品推荐

