是否可以在同一个未创建的结构中创建一个结构?

时间:2018-02-13 07:47:43

标签: c++ pointers object struct

以下声明是否可行?如果是这样,你如何访问结构中的元素?它编译但我无法访问元素。

struct node
{
    int a;
    struct node *next;
};
struct node *node1;
int main()
{
    node1->a = 5; // I cannot perform this operation
    return 0;
}

3 个答案:

答案 0 :(得分:2)

我认为您需要查看该语言的基础知识。所以也许可以按顺序链接到书单:

解决您的问题:

在这里,您可以定义一个类型,即名为node 的结构,包含类型为int的对象,以及类型为的对象,指向类型为node的对象< / em>(struct node*):

struct node
{
    int a;
    struct node *next;
};

在这里,您声明一个类型的全局对象指向节点类型的对象的指针:

struct node *node1;

请注意,默认情况下指针无效,也就是说,它们不会自动指向对象。

所以你有一个指针,但你实际上并没有一个类型的节点对象。 因此,不允许取消引用指针。禁止访问指针当前恰好指向的(任意)内存位置。

int main()
{
    node1->a = 5; // It is forbidden to perform this operation
    return 0;
}

为了解决这个问题。您需要创建一个对象并让指针指向它。

示例:

int main() {
    node n; // create an object of type node
    node1 = &n; // Assign the address of the object n to the pointer
    node1->a = 5; // Now it's allowed to dereference the pointer
}

最后:

  

是否可以在同一个未创建的struct中创建一个struct?

您可以拥有一个包含指向同一类型对象的指针的类型。这对于实现递归数据结构(例如链接列表或树)非常有用。

进一步阅读:

答案 1 :(得分:1)

根据您的MCVE,您不创建节点,您有一个未初始化的指针。对于您当前的问题,node* next似乎是一个红色的鲱鱼。

struct node
{
    int a;
    node *next; // seems to be a red herring to your current problem.
};

int main()
{
    node node1; // <-- for this demo, create it on the stack
    node1.a = 5;
    return 0;
}

请注意; node *可能更好地理解为在struct(允许)中创建指向同一类型结构的指针,而不是“未创建结构中的结构”。

答案 2 :(得分:1)

您无法访问字段,因为您只创建了一个结构实例的指针,而不是最后一个。像这样访问元素是一种未定义的行为。为了使其正确,您应该编写例如

struct node *node1;
int main()
{
    node1 = new node();
    node1->a = 5; // now ok
    node1->next = new node(); // again, before this we had an unitialized ptr.
    return 0;
}

另一个问题是,在这种背景下,这不是一种非常有效的方式。