繁体   English   中英

关于C++ memory地址的奇怪现象

[英]strange phenomenon about C++ memory address

那简直是疯了!
为了弄清楚对象如何存储在 C++ 中的 memory 中,
我编写以下代码来查看变量的地址。
但事情变得更加混乱。
所以在下面我想知道

为什么 1 与 2 不同 ------这是否意味着它是一个指针? 但为什么?
为什么 1 与 3 不同 ------ 它是通过引用传递的,它们应该是相同的?!

#include <iostream>
#include <vector>
using namespace std;

class A {
 public:
  A(int age, string name) : age_(age), name_(name){};
  void SetAge(int age) {
      age_ = age;
  }
  
  int age_;
  string name_;
};

void insert(vector<A>& p) {//passed by reference
    A a1{1, "tom"};
    printf(" p: %p\n", p); // p: 0x7ffc6cc98080 ------------3
    printf("&p: %p\n", &p);//&p: 0x7ffc6cc981a0 ------------4

    printf("&a1: %p\n", &a1); // &a1: 0x7ffc6cc980c0 /on stack, that's no problem

    p.push_back(a1);

    printf("&p[0]: %p\n", &p[0]); // &p[0]: 0x55b54cdd02c0 /on heap, that's no problem
}

int main()
{
    vector<A> persons;
    printf(" persons: %p\n", persons); // persons: 0x7ffc6cc981c0 ------------1
    printf("&persons: %p\n", &persons);//&persons: 0x7ffc6cc981a0 ------------2

    insert(persons);

    printf("&p[0]: %p\n", &persons[0]);// &p[0]:  0x55b54cdd0350
    printf("persons: %p\n", persons); // persons: 0x7ffc6cc981c0 /same as above
    cout << persons.size() << endl; //1
    
}

编辑:我很抱歉,5和6之间的区别不是真的,我不小心删除了一个push_back,我为你感到难过,希望没有让你感到困惑。

格式说明符%p要求参数的类型为void* 如果您传递错误类型的参数,则程序的行为是未定义的。

 printf(" persons: %p\n", persons);

在这里,您传递了一个vector<A>类型的参数,因此程序的行为是未定义的。

由于参数甚至不是指针,因此没有希望有意义的 output。

 printf(" persons: %p\n", &persons);

在这里,您传递了一个vector<A>*类型的参数,因此程序的行为是未定义的。

在这种情况下,参数至少是一个指针。 在所有指针具有相同表示的系统上,output 可能是有意义的,并表示存储指向的 object 的地址。 但是,这仍然违反了参数类型的前提条件,并且不应依赖该行为。


结论:

  • 不要对printf使用错误的类型,否则行为将是未定义的。 仔细研究文档。
  • 任何 class 类型都没有正确的格式说明符。
  • 不要使用printf 它很难正确使用,并且有更简单的替代方案。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM