簡體   English   中英

更改班級的私人成員

[英]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 structclass-key class定義的標准布局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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM