【发布时间】:2017-10-13 05:46:16
【问题描述】:
为什么每次我运行程序时变量地址都会有特定的差异(如“printf(”%d %d\n“,&a,&b);”。它会在一次运行中打印“1000 988” ,“924 912”在另一个,“1288 1276”,等等等等)?编译器是否在每个变量声明后都占用了一定数量的内存,无法写入任何内容?如果是,它取决于什么?在我的一个程序中使用一些变量,它们之间的最小差异是 12 个字节,它达到了 212。这是唯一一个差异不是 12 的倍数的情况(在其他情况下是 24、36 或 48字节)。这背后有什么原因吗?由于我的变量是 int 类型(在我的系统中占用 4 个字节),我的变量地址之间的差异会小于 12(例如 4)吗?这些地址差异是否取决于变量类型?如果是,以什么方式?提前谢谢!
【问题讨论】:
-
您的操作系统提供了所有应用程序运行的虚拟内存地址空间。当您的代码执行时,您的操作系统的内存管理器会填充应用程序对内存的请求,并在您的代码完成时释放内存(以便在您的操作系统需要的任何地方重用)。有时您可以在连续运行时为每个变量获得完全相同的地址,有时则不能,这取决于您的操作系统在启动时为应用程序提供的内容。 (从你的应用的角度来看——“这就像一盒巧克力......”)
-
你知道用
%d打印一个指针是UB吗?您的编译器可能会警告您。无论如何,正确的格式是%p。 -
@Deduplicator 我知道这一点。我只使用它是因为它更容易在小数之间进行算术,而不是十六进制。在这种情况下,打印的结果应该是正确的。
-
@DavidC.Rankin:感谢您的澄清!
标签: c memory memory-address