私のプロジェクトの変数(特にヒープ変数)の仮想アドレスを知る必要があります。変数のポインタ値は実際にはその仮想アドレスです。私の理解は、同じ変数の仮想アドレスが異なる実行で同じでなければならないということです。私もシンプルに書いた同じ変数が異なる実行で異なる仮想アドレスを持つのはなぜですか?
-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
、私は自分の考えを証明するために、次の簡単なコードを書いたが、それは間違っていることが判明し、
#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;
}
しかし、次のように私は別の実行のためのさまざまなポインタ値を得ました各プロセスが単に正確に同じ変数を生成するMPIコード。また、異なるプロセスの同じ変数には異なるポインタ値がありますが、これは私が期待した通りではありません。
これを私に説明できますか? ありがとう、
ありがとうございました!アドレスのランダム化が無効になっている場合、2回の実行で同じポインタ値を持つ可能性はありますか?ヒープ変数についても?ありがとう、 –
私は真剣にあなたがこれに頼ることができるかどうか疑問に思います。私はそれをお勧めしません。 –
ランダム化を無効にするには、http://stackoverflow.com/questions/1921485/pseudo-random-stack-pointer-under-linuxの指示に従ってください。ヒープ変数には、実行ごとに固定された仮想アドレスがあります。 –