Есть ли способ получить доступ к данным одного указателя C из другой программы C - PullRequest
0 голосов
/ 16 марта 2012

У меня две программы,

Программа A такая,

int main(int argc, char** argv) {

    char* s = "hello";

    printf(s);

    return (EXIT_SUCCESS);
}

Базовый адрес s равен 0x80484e0 "привет", теперь у меня есть программа B, как показано ниже

int main(int argc, char** argv) {

    void* p = (void*)0x80484e0;

    char* c = (char*)p;

    while(*c)
    {
        printf("%c",*c);
        c++;
    }

    return (EXIT_SUCCESS);
}

В программе B «p» указывает на тот же базовый адрес, что и «s» в программе B, но содержимое не совпадает.

Даже если «p» и «s» имеют один и тот же базовый адрес, их содержимое не одинаково, потому что они работают как разные программы в разных адресных пространствах?

Ответы [ 3 ]

4 голосов
/ 16 марта 2012

В программе B 'p' указывает на тот же базовый адрес, что и 's' в Программа B, но ее содержание не совпадает.

В этом волшебство виртуальных адресов и отдельных адресных пространств. Вам нужно изучить «разделяемую память» для вашей платформы.

Адреса, используемые программой: виртуальные . Они не совпадают с физическим адресом в оперативной памяти. Ядро делает некоторые приятные (неприятные) вещи с помощью MMU и таблицы страниц и скрывает это от процесса.

Так, например, в 32-битной системе процесс считает себя единственным пользователем памяти - он может использовать адреса от 0 до 0xffffffff - с некоторыми ограничениями.

Если вы оказались в системе POSIX, вы можете посмотреть mmap и shm_open.

2 голосов
/ 16 марта 2012

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

0 голосов
/ 16 марта 2012

Я верю, что это никогда не сработает.

В программе A "привет" - это строка, которая поставляется вместе с исполняемым файлом и загружается в память при вызове этой программы.

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