[英]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
使用錯誤的類型,否則行為將是未定義的。 仔細研究文檔。printf
。 它很難正確使用,並且有更簡單的替代方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.