为什么* struct_pointer = struct_variable与struct_pointer =& struct_variable的行为不同?

时间:2014-08-05 19:11:14

标签: c++ pointers struct

我对C ++比较陌生,我正在尝试使用 - >结构。我有这个代码,应该从结构中打印出名称和年龄。我知道 - >当变量是一个指针时使用,所以我试图用以下代码声明一个指向结构的指针:

typedef struct Person{
  string name;
  int age;
};

int main() {
  Person me;
  me.name = "name";
  me.age = 1;
  Person* me2;
  *me2 = me;
  cout << me2->name << "," << me2->age << endl;
  return 0;
}

此代码导致分段错误。

但是,如果我改变

*me2 = me

me2 = &me

代码工作正常(打印出姓名和年龄)。

我不确定为什么这两行代码不相同。我以为我被允许用*更改指针的内容,但我不确定为什么这不起作用。有人能帮我理解吗?

3 个答案:

答案 0 :(得分:7)

不同之处在于,*me2 = me行将me内容复制到me2个点中。默认情况下,me2不指向任何内容,这会产生未定义的行为(在您的情况下,它会导致段错误。)

但是,行me2 = &me会将me地址复制到me2,而不会取消引用无效指针。实际上,这使得me2指向一个有效的内存块(因为它指向me),因此是正确的行为。

答案 1 :(得分:0)

您需要了解在C ++中,星号(*)可能具有不同的含义,具体取决于使用它的上下文。

在一种情况下,*用于声明一个指向某事物类型的变量。当您在声明的变量名称左侧看到*时,这意味着什么。例如:

Person* me;

在这里,您要声明一个名为me的变量 - *位于其左侧,并且是me的类型名称的一部分。换句话说,me是指针类型的变量 - Person

在另一种情况下,*用于取消引用指针。要“取消引用”指针意味着跟随指针并获取它指向的值。如果*未用作typename的一部分,那么它将在此上下文中使用。一个例子是:

me = *pointerToOtherPerson;

此处,pointerToOtherPerson是(假设为)指针类型 - Person。所以这里发生的事情是pointerToOtherPerson被解除引用 - 指针被跟随到实际的Person对象,并且该对象通过me赋值被复制到=

相关操作是取一些东西的地址。这是通过addressof-operator &完成的。这是一个例子:

me2 = &me;

此处,me2是指针,mePerson对象(不是指针)。通过将&应用于me,您可以获取me的地址,并通过me2将该地址分配给=

答案 2 :(得分:0)

typedef struct Person{
  string name;
  int age;
};

这显然是在C ++中应用C-ism的尝试。不要那样做。在C ++中定义此结构的正确方法是:

struct Person{
  string name;
  int age;
};

现在,关于代码的其余代码......

  Person me;
  me.name = "name";
  me.age = 1;
  Person* me2;

这会创建一个指向Person的指针,指针的名称为me2。但是,您没有指定它应该指向的内容!这里的其他人说它相当于一个空指针。这是错误。其目标未指定,任何取消引用它的尝试都将是未定义的行为

因此,以下行会产生麻烦:

*me2 = me;

我们走了。通过编写*me,您试图获得对未定义的内容的引用。未定义的行为意味着允许程序崩溃。

接下来发生的事情是无关紧要的。此时,未定义的行为已经“破坏”了您的程序。

me2 = &me

这是不同的。您不取消引用me2指针,但为其指定一个定义的值,即me的地址。

  

我以为我被允许更改指针的内容   *

取决于“指针内容”的含义。在指针前加上*,您只需获得指针所指向的引用。如果它指向什么或没有定义的东西,那么行为是未定义的,可能会发生崩溃。

相关问题