【发布时间】:2013-05-10 15:05:15
【问题描述】:
我创建了一个简单的程序:
#include <stdio.h>
int main()
{
int s1;
int s2;
int s3;
int *p1, *p2, *p3;
p1 = &s1;
p2 = &s2;
p3 = &s3;
printf("%d\n%d\n%d", p1, p2, p3);
}
每当我运行这个程序时,它都会打印指针p1、p2和p3的内存地址,有趣的是这些值有12的差异。我想知道这背后的原因。为什么地址与12 不同?
注意:每次我执行程序都会发生这种情况。
输出:
我在许多类型的变量中测试了同一个程序,我得到的结果是..
当变量是 char 类型时。
当变量是长类型时
当我声明 int array 时,每个数组的大小为 1。
当第二个声明数组的大小为 2 时,它会获得额外的 4 字节偏移量。
【问题讨论】:
-
为什么不使用为打印指针设计的格式说明符,或者更好的是
std::cout?为什么不对main使用有效签名? -
这是什么编译器和平台?
-
这取决于编译器,就像每个人都说的那样。编译器可能已经把任何东西放在它想要的任何地方。您可能不会在发布版本中看到它。这些变量之间可能存在调试信息,可能是某种溢出检测或某些功能,例如 MSVC 在调试时进行的即时编译。您可以通过查看反汇编来查看其中的任何内容。
-
我猜是,由于分配的顺序,编译器选择交错
int和int*值,并且您在64位平台上。每个int4 个字节,每个int*8 个字节。但正如人们所说,看反汇编。 -
我认为您还应该了解correct signatures for
main以及为什么void mainis bad。
标签: c visual-c++ pointers memory