C++中的字符[]和字符[10]有什么区别?

What's the difference between char[] and char[10] in C++?

本文关键字:字符 什么 区别 C++      更新时间:2023-10-16

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个结束字符

char a[10] = "there";

字符数组a的大小为10,包括,因此您最多可以将9个字符放入int中。否则,您正在写入不属于该数组的内存。如果按照上述方式进行,字符5-9将被初始化为null。请在此处查看实际示例:http://ideone.com/O7c8Zp