为什么每次编译时内存地址都会改变?

问题描述:

为什么指定位置的地址不断变化?内存中发生了什么事情会导致这种情况发生,或者我的printf声明有什么问题?为什么每次编译时内存地址都会改变?

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 

     char blocks[3] = {'A', 'B', 'C'}; 

     char *ptr = &blocks[0]; 

     char temp; 

     temp = blocks[0]; 
     printf(" %c, %d ", temp, &temp); 

     return 0; 
} 

输出

A, 1764940775 
A, 1731746791 
+1

“指向位置”,即'temp',是一个char char变量;不是你的缓冲区,指向它的指针,或者任何与它相关的任何东西(虽然它们也在堆栈中)。这就是说,做到10,000次,你会看到模式形式。 – WhozCraig 2013-04-10 03:09:46

您应该使用%p转换说明的printf的指针值。但没有理由期望它每次都是相同的价值。但是,全局变量或静态变量应该位于一致的位置。

看起来像你的堆栈指针是随机的。我怀疑这是因为地址空间布局随机化,它被用作大多数新操作系统的安全机制。