int i=10;
printf("Address of i = %u",&i);
Output:
Address if i = 3220204848
Output on re-execution:
Address of i = 3216532594
我每次執行程序時都會得到一個新地址i
。這是什麼意思?爲什麼C中的每次執行後變量的地址變化?
int i=10;
printf("Address of i = %u",&i);
Output:
Address if i = 3220204848
Output on re-execution:
Address of i = 3216532594
我每次執行程序時都會得到一個新地址i
。這是什麼意思?爲什麼C中的每次執行後變量的地址變化?
它表示您的程序每次運行時都會加載一個不同的(虛擬)地址。這是一項名爲Address Space Layout Randomization (ASLR)的功能,是大多數現代操作系統的一項功能。
它的目的是爲了更加難以利用安全漏洞。 – starblue 2010-05-17 05:06:28
這就是操作系統的工作原理。當你聲明一個變量時,你要求底層系統分配一個內存塊(地址)來存儲這些數據(或者如果你正在處理指針,則指向另一個塊,但是在這裏你已經有了一個原語,所以它只是存儲數據)。程序不關心內存的位置,只是它存在,因爲它知道如何跟蹤它給出的內容。
作爲程序員,除非你做了一些令人難以置信的低級工作,否則這真的不是什麼大事。對於大多數人來說,要真正掌握最難的部分是,當你使用指針時,你不能像使用基元一樣將事物等同起來,因爲指針會考慮它們的值(當使用==作爲赤道)時他們的內存地址。
在執行c程序時,另一個進程正在運行。當再次執行代碼時,您將分配新的地址,之前分配的地址將被分配給另一個進程。
您正在生成未定義的行爲。不要使用%u來打印一個指針,使用'printf(「%p」,(void *)&i);' – Secure 2010-05-17 05:51:40