2015-12-30 2 views
1

У меня есть Dll, который я ввожу в свой целевой процесс. Эта Dll меняет некоторые переменные, указывая адреса памяти. Normaly я это люблю:написать строку в указатель C++

int* variable = (int*)0x????????; 
    *variable = 1; 

Теперь я хочу сделать то же самое с цепочкой. Чтение струнных произведений.

string* variable = (string*) 0x????????; 

Но изменение строки приводит к сбою процесса.

*variable = "hello world"; //crash 

Как это исправить?

+3

Это чрезвычайно изворотливый. Вы можете взломать его для простых встроенных типов, но 'std :: string' - это не такая вещь. Он содержит указатели на данные, и вы не справляетесь с этим. Что вы на самом деле пытаетесь достичь? –

+0

изменить строку, сохраненную по адресу. – nice

+0

Откуда у вас этот адрес? Почему, по вашему мнению, есть правильно построенный объект по этому адресу? – Slava

ответ

0

Вы не можете использовать std::string или любым другим, но не POD данным типа. Что вам нужно сделать вместо этого:

char* variable = (char*) 0x????????; 
strcpy(variable, "hello world"); 

или другие, возможно, специальные функции MS для управления строками C.

+0

удивительный, спасибо. – nice

0

Вы не указали, как вы гарантируете выделение памяти по адресу 0x???????? или инициализацию строкового объекта.

Если указатель не указывает на выделенную память, или если строка не инициализируется при ее назначении для копирования, вы получаете неопределенное поведение. Возможное неопределенное поведение:

Но изменение строки приводит к сбою процесса.

Чтобы исправить это, выделите и инициализируйте строковый объект и используйте адрес этой строки.

+0

какой-то источник, я мог бы пиявка? – nice