原文
在C語言中,指標變數的值就是一個記憶體地址,&運算子的作用也是取變數的記憶體地址,請看下面的代碼
#include <stdio.h>
#include <stdlib.h>
int a = 1, b = 255;
int main(){
int *pa = &a;
printf("pa = %#X, &b = %#X\n", pa, &b);
system("pause");
return 0;
}
在 C-Free 5.0 下運行,結果為:
pa = 0X402000, &b = 0X402004
代碼中的 a、b 是全域變數,它們的記憶體地址在鏈接時就已經決定了,以后再也不能改變,該程式無論在何時運行,結果都是一樣的。
以上是原文的代碼,然后我看了網上其它的文章,他們的運行每次輸出的結果也都是一樣的。
但我每次運行得到的地址都是變化的。是怎么回事呢?
以下是我的運行結果,每次都是不一樣的:
pa = 0X1278034, &b = 0X1278038
pa = 0X368034, &b = 0X368038
pa = 0XFE8034, &b = 0XFE8038
uj5u.com熱心網友回復:
每次運行時,分配的記憶體位置不一樣唄。這應該是正常的~你的電腦里一直在運行著程式,可能上次使用的位置被別的程式使用了,也是有可能的。uj5u.com熱心網友回復:
上面輸出的都是虛擬地址而不是物理地址, 那意思是說書上說的是錯的嗎?不可能每次運行輸出的地址都一樣。
uj5u.com熱心網友回復:
想弄清楚這個問題,需要了解一下可執行檔案的結構uj5u.com熱心網友回復:
不要在除錯中運行,直接雙擊檔案運行。uj5u.com熱心網友回復:
直接雙擊檔案運行也是每次結果都不同
uj5u.com熱心網友回復:
你的書是錯的。編譯完成后,決定的只是 a、b 的相對地址(相對于基址),而絕對地址不作保證。實際上,現代作業系統會特意改變基址的位置,以使 a、b 的絕對地址發生變化。經過特殊配置的或者較老的作業系統是不支持這種地址隨機化的操作的。注:C 語言標準只規定 a、b 在單獨的每次程式的執行程序中的地址從不變化,但未曾保證多次執行程式還能保持地址相同。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108726.html
標籤:C語言
下一篇:大神們 這個程度應該怎么撰寫
