Почему одна и та же переменная получала разные виртуальные адреса при разных прогонах? - PullRequest
2 голосов
/ 25 июня 2011

Мне нужно знать виртуальный адрес переменных (в частности, переменной кучи) в моем проекте.Значение указателя переменной фактически является ее виртуальным адресом.Насколько я понимаю, виртуальный адрес одной и той же переменной должен быть одинаковым при разных запусках.Я написал следующий простой код, чтобы доказать свои мысли, но он оказался неправильным:

#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
    int node=0;
    char* buffer;
    int i;
    printf("Hello World from Node %d the vm of i is %p and %ld \n",node, &i,&i);
    buffer = (char*)malloc(sizeof(char)*1024*1024*300); 
    for(i = 0; i < 1024*1024*300; i++){
    buffer[i] = (char)1;
}   
printf("I  am in %d and the vm of buffer is %p:%ld \n",node, buffer,buffer);
return 0;
}

Но я получил разные значения указателя для разных прогонов следующим образом:

-bash-4.0$ gcc singletest.c
-bash-4.0$ ./a.out 
Hello World from Node 0 the vm of i is 0x7fffb87a8e00 and 140736288427520 
I  am in 0 and the vm of buffer is 0x7fb05dfcf010:140395467829264 
-bash-4.0$ ./a.out 
Hello World from Node 0 the vm of i is 0x7fffec2856f0 and 140737155454704 
I  am in 0 and the vm of buffer is 0x7f5888c54010:140018228477968 
-bash-4.0$ ./a.out 
Hello World from Node 0 the vm of i is 0x7fff1f44a780 and 140733717981056 
I  am in 0 and the vm of buffer is 0x7fbea3b91010:140456767328272 

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

Кто-нибудь может мне это объяснить?Спасибо,

Ответы [ 2 ]

1 голос
/ 25 июня 2011

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

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

0 голосов
/ 25 июня 2011

Этот вопрос похож на один из моих: Псевдослучайный указатель стека в Linux?

Все это сделано по соображениям безопасности, как описывает ссылка в awser.

...