我们可以像this
那样设置类的私有变量我试图为下面的情况设置私有成员变量int。
#include <iostream>
#include <string>
using namespace std;
class Test
{
private:
string s;
int data;
public:
Test() : s("New") , data(0) { }
int getData() { return data; }
};
int main()
{
Test t;
int* ptr = (int*)&t;
*(ptr+sizeof(string)) = 10;
cout << t.getData();
return 0;
}
但它无法打印10。
我知道还有其他方法可以使用setter函数设置它,但是检查使用显示的方法设置here
这纯粹是黑客攻击,但无法学习。
答案 0 :(得分:4)
我认为这将解决它:
char* ptr = (char*)&t;
*(int*)(ptr+sizeof(string)) = 10;
sizeof将返回以字节为单位的大小。指针增量将指向其指向的对象的大小。 char是一个字节大小。
如果您想阅读它:C pointer arithmetic article
重申我认为你已经说过的话:你只是作为一个学习点进行黑客攻击,而且你知道在现实生活中你不可能做到这一点。 。!!
答案 1 :(得分:2)
真的只是永远不会写这样的代码。有一种方法可以通过类中的公共成员设置私有数据。否则,出于某种原因,它是私有的。这是C ++,实际上有非UB方式这样做,但我不打算在这里链接它们,因为不要。
提示:ptr + sizeof(string)
实际上是什么意思,ptr
是int*
? ptr
指向此行后的内容是什么?
答案 2 :(得分:1)
指针算法应该用字节指针完成,而不是整数指针。
#include <iostream>
#include <string>
using namespace std;
class Test
{
private:
string s;
int data;
public:
Test() { s = "New", data = 0; }
int getData() { return data; }
};
int main()
{
Test t;
char* ptr = (char*)&t;
*(int*)(ptr+sizeof(string)) = 10;
cout << t.getData();
return 0;
}