2012-05-30 2 views
2

Я только что начал изучать C++, поэтому я могу быть в стороне от этой отметки, но легко на меня.Запись в указанную ячейку памяти

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

код я использую:

#include <iostream> 

int main() 
{ 
    using namespace std; 

    int i = 100; 
    int* p = &i; 
    cout << p << "\n"; 
    cout << "Writing" << "\n"; 
    int* w = (int*)0x28ff18; 
    *w = 101; 
    cout << *p << "\n" << "Done"; 
    return 0; 
} 

Адрес я для i является 0x28ff18, так что можно написать в этом месте, указав этот адрес? Вместо использования *p = 101. Очевидно, что то, что я использую, не меняет его, я не знаю, где или когда он пишет 101.

Любое простое объяснение или помощь очень ценятся.

+0

Это локальный адрес в памяти? –

+2

Это не звучит безопасно для меня .. – Jack

+0

@dystroy Я так думаю, это адрес, который он выводит на консоль, когда я возвращаю местоположение 'i'. –

ответ

4

На большинстве компьютеров и с большинством компиляторов, вероятно, что-то вроде этого. Но стандарт C++ ничего не гарантирует.

Например, когда я скомпилировал и запустил ваш код с помощью MSVC++ на компьютере под управлением Windows, каждый раз, когда адрес был другим. Вы не можете ожидать, что он будет одинаковым между разными прогонами одной и той же программы.

Также обратите внимание, что целое число, в котором вы храните значение указателя, должно быть достаточно большим (например, 64-разрядное целое число, когда у вас есть 64-разрядные указатели). Используйте uintptr_t, если вы хотите это сделать (спасибо larsmans за указание этого).

+0

Да, я думаю, что вся идея не получать одно и то же место, где все пошло не так, я попробовал еще раз, и он дал то же самое адрес, чтобы он работал, но я думаю, он может меняться каждый раз. –

+1

'uintptr_t' - стандартный тип для хранения значений указателя в целых переменных, а не' size_t'. –

3

Адрес i может отличаться от одного прогона программы к следующему. Это очень опасно. Пожалуйста, не делайте этого; есть причина, по которой адреса памяти скрыты за абстракцией указателей на C++.

Единственные места, где вы увидите литературные адреса памяти, - это очень маленькие встроенные системы и ядра/драйверы операционной системы.

3

Хотя можно записать в определенную ячейку памяти, это не обязательно означает, что это безопасно.

В средах, где у вас есть все пространство памяти (в частности, встроенные системы), обычно приходится записывать на определенный адрес памяти для выполнения операций ввода-вывода с отображением памяти. В ситуациях, когда операционная среда контролирует ваше пространство памяти, небезопасно записывать в любую память, которая не была выделена вашей программе.

Смежные вопросы