C++中的字符[]和字符[10]有什么区别?
What's the difference between char[] and char[10] in C++?
char[]和char[10](或任何其他任意常数(之间有区别吗?
例如:
char[] = "here";
char[10] = "there";
当我运行这样一个程序时:
struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char elem;
};
void BinaryTreeFromOrderings(char* ,char* ,int);
int main()
{
char a[] = "";
char b[] = "";
cin >> a >> b;
BinaryTreeFromOrderings(b, a, strlen(a));
return 0;
}
void BinaryTreeFromOrderings(char* inorder, char* preorder, int length)
{
if(length == 0) return;
TreeNode* node = new TreeNode;
node->elem = *preorder;
int rootIndex = 0;
for(;rootIndex < length ; rootIndex ++)
{
if(inorder[rootIndex] == *preorder)
break;
}
//left
BinaryTreeFromOrderings(inorder,preorder+1,rootIndex);
//right
BinaryTreeFromOrderings(inorder + rootIndex +1 ,preorder + rootIndex +1,length - (rootIndex + 1));
cout << node->elem;
delete [] node;
return;
}
结果似乎是正确的,但程序将在退出前转储。
然后我做了一个实验:
int main()
{
char a[] = "";
cin >> a;
cout << a;
return 0;
}
当我输入少于9个字符时,它将成功运行。(gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5((
如果我用初始化[]
char a[] = "123456789";
它将成功少于25个字符。
我想编译器无法确定a的大小。但具体原因是什么?
char[] = "here";
这是一个大小为5的数组,由4个字母自动推导而来,加上一个附加在末尾的隐式null终止符("\0"(。您可以从0-4位置进行写和读操作。任何其他行为都是未定义的行为。
char[10] = "there";
这是一个数组,大小为10,内容为"there "
。您可以从0-9位置进行写和读操作。任何其他行为都是未定义的行为。
char a[] = "";
这是一个大小为1的数组,只是一个空终止符。当您在其中输入9个字符时,这是未定义的行为。(实际上,使用标准字符串输入函数,您甚至不能安全地输入1个字符,因为标准字符串输入功能会自动附加一个空终止符
char a[] = "123456789";
这是一个大小为10的数组,当您在其中输入25个字符时,这是未定义的行为。
http://en.wikipedia.org/wiki/Undefined_behavior
char a[] = "here";
编译器将确定字符数组a
的大小,即4个字符+1个结束字符