以下声明是否可行?如果是这样,你如何访问结构中的元素?它编译但我无法访问元素。
struct node
{
int a;
struct node *next;
};
struct node *node1;
int main()
{
node1->a = 5; // I cannot perform this operation
return 0;
}
答案 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;
}
另一个问题是,在这种背景下,这不是一种非常有效的方式。