Используя int*
, вы предполагаете, что данные, на которые вы указываете, равны int
(4 байта, в большинстве ОС).
Разве мы не должны вместо этого использовать void*
? Позже, если вы хотите получить доступ к его данным с использованием определенного типа, все, что вам нужно сделать, это привести.
void *addr = (void*)0x0023FF74; // valid memory address within my app
printf("Address: %p\n", addr);
getchar();
printf("Data (4bytes): %d\n", *(int*)addr); // print the first 4 bytes of data as int
getchar();
EDIT
Помогите мне понять, что вы пытаетесь сделать, потому что это утверждение смутило меня:
Есть приложение, использующее этот адрес, я знаю значение в нем, но указатель (int) не имеет доступа к значению.
Вы пытаетесь написать приложение, которое будет изменять память другого приложения, на котором работает ваша система? Ваш текущий подход не сработает, и вот почему: когда операционная система загружает ваше приложение в процесс, она резервирует область памяти для использования процессом и назначает диапазон виртуальных адресов этому региону. Эти виртуальные адреса не отображаются напрямую на адреса памяти в ОЗУ, поэтому ОС должна хранить для этого внутреннюю таблицу.
В Windows каждый загруженный процесс получает одинаковый диапазон виртуальных адресов, но эта область видна только процессу, выполняющемуся внутри него. Например, (в Windows) процессы загружаются в адрес памяти 0x00400000, что означает, что каждый процесс имеет свой собственный адрес памяти 0x00400000 , и поэтому вы не можете назначить адрес памяти X указателю в вашем приложении и ожидать Windows волшебным образом знает, что вы ссылаетесь на адрес X, который находится внутри другого приложения.
То, что вы пытаетесь выполнить, называется Внедрение кода , и в Интернете много информации об этом.