выделение памяти для указателя - PullRequest
5 голосов
/ 02 февраля 2011

Я отлаживал программу на двух терминалах, давая разные входные данные, но в частности я видел это на одном терминале

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c)

и в другом терминале

ins (ptr=0x0, key=1, upKey=0xbffff308, newnode=0xbffff30c)

где функция ins

ins(struct node *ptr, int key, int *upKey,struct node **newnode)

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

Ответы [ 3 ]

9 голосов
/ 02 февраля 2011

Адреса памяти, которые вы просматриваете, являются виртуальными адресами. Эти адреса затем преобразуются процессором в физические адреса. Это основа всех современных операционных систем. Каждый процесс считает, что ему принадлежит все адресное пространство (4 ГБ в случае 32-разрядной машины, намного больше в случае 64-разрядной машины). Когда процесс обращается к памяти, которая еще не выделена, ЦПУ генерирует ошибку страницы. Затем ОС может обработать этот недопустимый доступ к памяти одним из нескольких способов; Одним из распространенных способов является ошибка сегментации.

5 голосов
/ 02 февраля 2011

При использовании виртуальной памяти каждая программа, работающая в системе, действует так, как будто у нее есть все адресное пространство компьютера.Однако каждый раз, когда указатель разыменовывается, специальная часть оборудования преобразуется из предполагаемого адреса указателя (его виртуальный адрес ) в другое место в памяти, где данные фактически живут (физический адрес )1004 *).Операционная система создана для управления и перемещения областей памяти, в которые отображаются виртуальные адреса, поэтому, если одна программа разыменовывает какой-либо адрес A , она будет отображаться в другое место в физической памяти, чем если бы вы получилиразыменованный адрес A в другом процессе.Фактически, любое количество программ может претендовать на использование адреса A без хлопот, поскольку все эти виртуальные адреса разрешаются по разным физическим адресам в системе.

1 голос
/ 02 февраля 2011

Помимо тех, которые адресованы как виртуальные и «частные» для каждого процесса, не забывайте, что некоторая физическая память действительно может быть разделена между процессами.Например, когда вы fork() обрабатываете процесс, он не сразу полностью копируется - код просто остается открытым, а страницы данных копируются только при попытке их изменить («копировать при записи»), поэтому две программы действительно могут иметь физическую общую память(прозрачно для них).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...