簡體   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