【问题标题】:What's the difference between char[] and char[10] in C++?C++ 中的 char[] 和 char[10] 有什么区别?
【发布时间】:2013-05-23 03:44:18
【问题描述】:

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 的大小。但具体原因是什么?

【问题讨论】:

  • 我相信这个问题之前已经被问过十次了
  • 尝试不初始化它,你会看到不同。
  • 用 std::string 代替 char[]

标签: c++ char


【解决方案1】:
 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

【讨论】:

    【解决方案2】:
    char a[] = "here";
    

    编译器会确定char数组a的大小,即4个字符+1个结束字符\0

    char a[10] = "there";
    

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

    【讨论】:

    • 一个小小的挑剔:“如果你按照上面的方式,字符5-9没有被初始化。” -- 事实上,它们是。如果您为数组提供任何初始化程序,所有未指定的元素都会被默认初始化(在这种情况下为零)。
    猜你喜欢
    • 2011-04-23
    • 1970-01-01
    • 2014-03-21
    • 2020-07-29
    • 2019-06-10
    • 2014-05-03
    • 2020-06-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多