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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 10:52:35