【问题标题】:Some questions on C++ struct and array关于 C++ 结构和数组的一些问题
【发布时间】:2009-10-18 11:56:25
【问题描述】:

我对 C++ 比较陌生,在理解 struct 时遇到问题。

我有一个声明如下的结构

struct MyNode {
    int level;
    int index;
    MyNode children[4];
}

但是代码编译失败,报错C2148:数组总大小不得超过0x7fffffff字节。

但是下面的代码可以编译

struct MyNode {
    int level;
    int index;
    MyNode* children;
}

我可以像第一个示例那样对 MyNode 进行编码吗?或者我缺少什么。

谢谢!

【问题讨论】:

  • 什么编译器?正如其他人指出的那样,在这种情况下,它可以为您提供更好的诊断。

标签: c++ struct


【解决方案1】:

这无法编译,因为编译器需要知道每种类型的大小。 那么,sizeof(MyNode) 是什么?这是sizeof(int) * 2 + sizeof(MyNode):递归使得大小无法计算。

你需要一个指针,就像你的第二个例子一样。为什么这行得通?因为sizeof(MyNode*) 是已知的:它是目标平台上地址的大小。

【讨论】:

  • 感谢 TheSamFrom1984!我终于明白了你给定的例子发生了什么,并让我的代码正常工作。 :D
【解决方案2】:

第一个例子的问题是你的结构有一个递归扩展。每个子 MyNode 本身都包含四个 MyNode,而这四个 MyNode 又包含另外四个 MyNode,而这四个 MyNode 又依次...您明白了。

您需要为每个孩子使用一个指针来指示树的深度。

【讨论】:

    【解决方案3】:

    看看this。您需要了解“前向引用”。

    【讨论】:

      【解决方案4】:

      您不能构造一个使用自己的类型作为其中一个字段的类型的结构,因为在运行时编译器不会知道整个结构的大小。您编写结构的方式正是它在内存中的样子,即 4 个字节用于级别,4 个字节用于索引和 ?? MyNode 的字节数。看到问题了吗?

      现在在第二个例子中,你知道 MyNode::children 的类型,它是一个指针,所以它的大小是 4(在 32 位 Windows 系统上),所以结构的总大小是已知的:4+4 +4=12。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-07-20
        • 1970-01-01
        • 2012-08-19
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 2016-09-09
        相关资源
        最近更新 更多