Подтвердить что ты не робот

Может ли адрес указателей в двух программах быть равным?

Когда две программы одновременно запускаются, и вы печатаете адрес, на который указывает указатель, может ли случиться, что обе программы печатают одно и то же значение?

4b9b3361

Ответ 1

Да. Программа работает в виртуальной памяти, выделенной ОС. Объем виртуальной памяти определяется архитектурой процессора.

Адрес, который вы видите, относится к адресу виртуальной памяти, а не к физическому адресу RAM.

Я бы добавил, что каждый процесс, запущенный в системе, получает огромное адресное пространство (2 ^ 32 на 32-битной ОС и 2 ^ 64 на 64-разрядной ОС), выделенное ему. Это в этом виртуальном адресном пространстве, в котором выполняется процесс.

Ответ 2

В таких операционных системах, как Linux, запущенная программа называется process. Каждый процесс имеет собственное адресное пространство и использует виртуальную память. Таким образом, тот же адрес 0x12345 обычно относится к разным ячейкам памяти в процессе A и в процессе B.

Прочитайте Расширенное программирование Linux, в котором есть некоторые главы, объясняющие это (с точки зрения Linux). См. Также системный вызов fork и прочитайте fork (2), mmap (2), execve (2) man pages.

Другие операционные системы (Windows, MacOSX) также имеют процессы, работающие в своем собственном адресном пространстве с использованием виртуальной памяти.

Подробности могут быть довольно сложными (и на самом деле некоторые операционные системы могут быть разделены между процессами...). Читайте о копировать при записи, общая память и т.д....

Читайте также хорошую книгу о Операционных системах, например. книга Tanenbaum, или Операционные системы: три простых пьесы (бесплатно загружаемые онлайн).

Ответ 3

Название вопроса не совсем соответствует телу. Название спрашивает:

Может ли адрес указателей в двух программах быть равным?

Да, это возможно, поскольку другие уже указывали, что там происходит виртуальная память и всевозможные другие трюки.

Кроме того, константа указателя NULL, как правило, всегда одинакова в каждом экземпляре программы (честно говоря, я не знаю о платформе, где она будет отличаться от run to run). Поэтому, если в обеих программах вы печатаете NULL, он даже ожидал, что результаты будут идентичными.


Теперь в вопросе вы спрашиваете о печати этих указателей, что совсем другое:

Когда две программы одновременно запускаются, и вы печатаете адрес, на который указывает указатель, может ли случиться, что обе программы печатают одно и то же значение?

Поскольку это помечено тегом c, я отвечу на него с точки зрения C:

Да. Предполагая, что вы имели в виду printf("%p", (void *)thePointer), это вполне возможно. Спецификатор преобразования %p форматирует указатель в соответствии с реализацией. Кроме того, если вы печатаете его как целое число после правильного преобразования типа, то опять же результат преобразования определяется реализацией. Таким образом, ваша программа всегда может печатать 0xffffffff или foobar или why are you even curious of internals like a pointer value каждый раз, когда вы пытаетесь напечатать указатель. Так что да, возможно, что две программы будут иметь одинаковый выход.

Ответ 4

Язык C не определяет взаимодействие между двумя различными процессами. Нет никакой гарантии, что указатели в двух разных программах будут иметь какое-либо значимое соединение друг с другом.

Если вы укажете операционную систему, компилятор C и как выполняются программы, может быть предоставлен ответ, который поможет вам.

Однако это не то, что C-язык пытается контролировать, и полностью зависит от операционной системы и аппаратного обеспечения программ.

Ответ 5

Да, это может произойти. Программа работает в виртуальной памяти. Если процесс начинает выполняться, для каждого процесса создается process address space. При печати не только 2 процесса, несколько процессов могут иметь один и тот же адрес.

fooobar.com/questions/202087/... расскажет вам, как будет выглядеть адресное пространство процесса... И каждый процесс имеет аналогичную копию, выделенную ОС.