[英]Change private member of class
訪問和更改私人班級成員的價值:
#include <stdio.h>
class hack_Me
{
private:
size_t age;
public:
size_t getAge() const
{
return this->age;
}
explicit hack_Me(size_t age):age(age) { }
};
void change_age(hack_Me* h)
{
*((int*)h) = 100;
}
int main(int argc, char* argv[])
{
hack_Me h(12);
printf("%d \n", h.getAge());
change_age(&h);
printf("%d \n", h.getAge());
getchar();
return 0;
}
12點后打印100。
它適用於MSVC 14。
此行為是否未定義和/或依賴於編譯器?
更新 :StackOverflow會給你點贊嗎?
此行為是否未定義和/或依賴於編譯器?
使用int*
訪問size_t
類型的變量是不好的,無論該變量是在類內部還是本身。
如果您使用
*(reinterpret_cast<size_t*>(h)) = 100;
這不是未定義的行為,也不依賴於編譯器。 我懷疑,使用以下內容不會有什么不同:
*((size_t*)h) = 100;
您的課程符合標准布局 struct
的要求。
從C ++ 11標准:
9節課
...
7標准布局類是這樣的類:
—沒有非標准布局類(或此類數組)或引用的非靜態數據成員,
—沒有虛擬函數(10.3)和虛擬基類(10.1),
—對所有非靜態數據成員具有相同的訪問控制(條款11),
-沒有非標准布局的基類,
—在派生最多的類中沒有非靜態數據成員,並且在最多一個具有非靜態數據成員的基類中,或者沒有具有非靜態數據成員的基類,並且
—沒有與第一個非靜態數據成員相同類型的基類。
8 標准布局結構是用class-key
struct
或class-keyclass
定義的標准布局class
。
對於標准布局 struct
,對象的指針可以別名為第一個成員變量的指針。
從C ++ 11標准:
9.2班級成員
...
20指向標准布局結構對象的指針(使用
reinterpret_cast
進行了適當轉換)指向其初始成員(如果該成員是位域,則指向其駐留的單元),反之亦然。 [注意:因此,在標准布局結構對象中可能會存在未命名的填充,但在其開始時可能沒有,這是實現適當對齊所必需的。 — 尾注 ]
在hack_Me內部,您有size_t age;
可能小於int(例如,在8位體系結構下,sizeof(size_t)== 1和sizeof(int)== 2)。 如果您的編譯器在hack_Me的末尾沒有生成填充,則可能會發生整個hack_Me小於int的情況,因此*((int*)h) = 100;
可能會覆蓋比僅hack_Me的第一個成員更多的內存。 將hack更改為*((size_t*)h) = 100;
可能還可以(請參閱其他答案)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.