因为rptr-> num = 30与(* rptr)相同.num = 30但是*((* rptr).ptr).name不起作用的原因?

时间:2017-10-17 16:05:10

标签: c++

我有两个结构

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不起作用。

3 个答案:

答案 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个对象
  • 仔细复制“Wellcome”字符串(添加边界检查)

答案 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表示您根本不必担心strcpystrlen等不安全的操作。它会起作用。

现在,大概你的程序只是一个例子,你有一个更大的程序,你实际上正在努力。但这些原则是一样的。除非你绝对必须,否则不要使用裸指针。使用C ++指针类。他们是你的朋友,会让你的生活更轻松。使用标准库中的::std::string::std::vector::std::array和其他类似类。它们会让你的生活更轻松。