我有两个结构
struct temp
{
char name[20];
};
struct abc
{
temp *ptr;
int num;
};
这是主要功能。
main()
{
abc *rptr;
strcpy((rptr->ptr)->name,"Wellcome");
cout<<(rptr->ptr)->name; //works
cout<<*((*rptr).ptr).name; //does not work why?
}
我想知道为什么最后cout
不起作用。
答案 0 :(得分:3)
该行:
cout << *((*rptr).ptr).name;
不起作用,因为.
上的操作((*rptr).ptr)
优先于*
使用以下方法修复:
cout << (*((*rptr).ptr)).name;
重要强>
请注意,您的代码中存在更大的问题:
rptr
abc
包含指针至temp
,不 实例!执行此操作:strcpy((rptr->ptr)->name,"Wellcome");
被视为犯罪!你破坏了所有的记忆!
相反,它应该是这样的:
abc *rptr = new abc();
rptr->ptr = new temp();
strncpy(rptr->ptr->name, "Wellcome", sizeof(rptr->ptr->name));
cout << rptr->ptr->name << endl;
delete rptr->ptr;
delete rptr;
修正:
rptr
对象ptr
rptr
个对象
答案 1 :(得分:1)
由于优先规则,它不起作用。 .
(结构成员选择)的绑定高于*
(指针解除引用)。加上一些括号,它就可以了。注意你如何在内部指针取消引用周围放置括号,为什么跳过外部?
答案 2 :(得分:0)
所以你接受的答案是一个很好的答案,告诉你如何解决你在做什么以及为什么它不起作用。
这个答案是告诉你应该做什么。因为你所做的不是C ++。在现代C ++中,你必须处理指针应该是不常见的。这是C ++对C的巨大优势,也是我认为选择语言的主要原因之一。
以下是两种结构的外观:
#include <memory>
#include <string>
struct temp
{
::std::string name;
};
struct abc
{
::std::unique_ptr<temp> ptr;
int num;
};
以下是你的主要应该如何看待:
#include <iostream>
#include <memory> // Probably redundant, but you do use it directly here.
int main()
{
using ::std::unique_ptr;
using ::std::cout;
using ::std::make_unique;
// If you don't have make_unique (it was added in C++14) use new instead.
unique_ptr<abc> rptr = make_unique<abc>();
rptr->ptr = make_unique<temp>();
rptr->ptr->name = "Wellcome";
cout << (rptr->ptr)->name;
cout << (*(*rptr).ptr).name;
return 0;
}
unique_ptr
个对象会在超出范围时自动释放他们指向的内容。因此,首先rptr
消失,因此它指向的abc
被销毁,这将摧毁ptr
成员abc
,这将导致temp
你分配的也被释放了。
是的,这些是技术指针,但编译器将为您管理它们的生命周期,以便您没有泄漏或意外地释放两次。
此外,使用::std::string
表示您根本不必担心strcpy
和strlen
等不安全的操作。它会起作用。
现在,大概你的程序只是一个例子,你有一个更大的程序,你实际上正在努力。但这些原则是一样的。除非你绝对必须,否则不要使用裸指针。使用C ++指针类。他们是你的朋友,会让你的生活更轻松。使用标准库中的::std::string
,::std::vector
,::std::array
和其他类似类。它们会让你的生活更轻松。