我从网站上看到*ch[]是实际的二维数组或字符,但当我自己用C++编写二维数组时,结果就不同了。有人能描述一下为什么会这样吗?
下面是我的代码:
#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;
}它正在返回:
123456
12发布于 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‘
发布于 2020-06-29 20:01:24
是
char ch[][]和char *ch[]是相同的
不,它们是不一样的。
char ch[][]是长度不定的数组中长度不定的数组。这样数组是病态的,因为数组元素可能不是长度不定的数组。
char *ch[]是一个长度不定的指针数组。
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的指针数组。
https://stackoverflow.com/questions/62637492
复制相似问题