gpt4 book ai didi

c++ - C++ 中的 char[] 和 char[10] 有什么区别?

转载 作者:太空宇宙 更新时间:2023-11-04 15:05:20 24 4
gpt4 key购买 nike

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))

如果我用以下方法初始化 a[]:

char a[] = "123456789";

少于 25 个字符将成功。

我想编译器无法确定 a 的大小。但具体原因是什么?

最佳答案

 char[] = "here";

这是一个大小为 5 的数组,自动从 4 个字母推导出来,加上一个隐式的空终止符 ('\0') 添加到末尾。您可以从位置 0-4 写入和读取。其他任何行为都是未定义的行为。

char[10] = "there";

这是一个大小为 10 的数组,内容为 "there\0\0\0\0\0"。您可以从位置 0-9 写入和读取。其他任何行为都是未定义的行为。

char a[] = "";

这是一个大小为 1 的数组,只是一个空终止符。当您向其中输入 9 个字符时,这是未定义的行为。 (实际上,使用标准字符串输入函数,您甚至不能安全地输入 1 个字符,因为标准字符串输入函数会自动附加空终止符。

char a[] = "123456789";

这是一个大小为 10 的数组,当您向其中输入 25 个字符时,这是未定义的行为。

http://en.wikipedia.org/wiki/Undefined_behavior

关于c++ - C++ 中的 char[] 和 char[10] 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16705308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com