2010-05-17 27 views
3
int i=10; 
printf("Address of i = %u",&i); 

Output: 
Address if i = 3220204848 

Output on re-execution: 
Address of i = 3216532594 

我每次執行程序時都會得到一個新地址i。這是什麼意思?爲什麼C中的每次執行後變量的地址變化?

+0

您正在生成未定義的行爲。不要使用%u來打印一個指針,使用'printf(「%p」,(void *)&i);' – Secure 2010-05-17 05:51:40

回答

7

它表示您的程序每次運行時都會加載一個不同的(虛擬)地址。這是一項名爲Address Space Layout Randomization (ASLR)的功能,是大多數現代操作系統的一項功能。

+1

它的目的是爲了更加難以利用安全漏洞。 – starblue 2010-05-17 05:06:28

1

這就是操作系統的工作原理。當你聲明一個變量時,你要求底層系統分配一個內存塊(地址)來存儲這些數據(或者如果你正在處理指針,則指向另一個塊,但是在這裏你已經有了一個原語,所以它只是存儲數據)。程序不關心內存的位置,只是它存在,因爲它知道如何跟蹤它給出的內容。

作爲程序員,除非你做了一些令人難以置信的低級工作,否則這真的不是什麼大事。對於大多數人來說,要真正掌握最難的部分是,當你使用指針時,你不能像使用基元一樣將事物等同起來,因爲指針會考慮它們的值(當使用==作爲赤道)時他們的內存地址。

0

在執行c程序時,另一個進程正在運行。當再次執行代碼時,您將分配新的地址,之前分配的地址將被分配給另一個進程。

相關問題