首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >char ch[][]和char *ch[]是否相同

char ch[][]和char *ch[]是否相同
EN

Stack Overflow用户
提问于 2020-06-29 19:51:22
回答 2查看 139关注 0票数 0

我从网站上看到*ch[]是实际的二维数组或字符,但当我自己用C++编写二维数组时,结果就不同了。有人能描述一下为什么会这样吗?

下面是我的代码:

代码语言:javascript
复制
#include <iostream>
using namespace std;
int main()
{
    char ch[3][2] = {{'1','2'},{'3','4'},{'5','6'}};
    cout<<ch[0]<<endl;
    char *cha[3] = {"12","34","56"};
    cout<<cha[0];
    return 0;
}

它正在返回:

代码语言:javascript
复制
123456
12
EN

回答 2

Stack Overflow用户

发布于 2020-06-29 19:56:56

它们不是一回事。char[]将衰减为char*,因此对于cout << ch[0],使用的函数是std::ostream &operator<<( std::ostream &out, const char *str )。因为您的ch[][]数组没有任何null结束符,所以它会一直打印,直到找到一个(您实际拥有的,在UB中)。你的代码恰好在'123456‘之后结束,但是没有任何东西可以保证这一点。

然而,char *cha[3]限制了三个字符串,并分配了三个以空值结尾的c-char *。所以,正如你所期望的,它打印出'12‘

票数 5
EN

Stack Overflow用户

发布于 2020-06-29 20:01:24

char ch[][]char *ch[]是相同的

不,它们是不一样的。

char ch[][]是长度不定的数组中长度不定的数组。这样数组是病态的,因为数组元素可能不是长度不定的数组。

char *ch[]是一个长度不定的指针数组。

代码语言:javascript
复制
char ch[3][2] = {{'1','2'},{'3','4'},{'5','6'}};
cout<<ch[0]<<endl;

在这里,将指向字符的指针(数组隐式转换为指向第一个元素的指针)插入到字符流中。字符流要求这样的字符数组(即字符串)必须以null结尾。您的字符数组不是null终止的。由于违反了前置条件,程序的行为是未定义的。

char *cha3 = {"12","34","56"};

另一方面,这在C++11和更高版本中是错误的,因为您使用常量数组(字符串文字)初始化指向非常数的指针。要解决此问题,请改用指向conts char的指针数组。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62637492

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档