在C和C ++中存储和显示的地址有什么区别?

时间:2015-03-27 15:06:57

标签: c++ c

在C中,如果我创建一个变量并打印出这样的地址:

int a;
int main (void) {
    printf ("%p", &a);
    return 0;
}

输出结果为: 00AA

使用以下行的C ++中的相同程序:

cout << &a << endl;

输出为: 0x8f970aa

这两者有什么区别?

我使用Turbo C编译了两个程序。

4 个答案:

答案 0 :(得分:17)

除非您使用某些特殊的系统特定链接器文件,否则无法保证您的变量将在内存中以哪个地址结束。它甚至可能最终出现在从编译到编译同一编译器的不同位置。当然,不同的编译器会有不同的表现。没有标准说明他们应该如何分配变量。

这与C与C ++无关。这两个标准都规定应该为您的变量分配静态存储持续时间。未明确初始化的所有静态存储持续时间变量都由C和C ++标准保证初始化为零(参见例如C11 6.7.9 / 10)。

这意味着两个标准间接保证变量在.bss中分配。完全 .bss中的未在任何地方指定。

Related question

答案 1 :(得分:5)

这种比较没有意义,因为C和C ++是不同的语言。此外,对于使用相同编译器在同一台计算机上使用相同语言的每次代码运行,您可能会获得不同的输变量a的内存不必分配在同一位置。结果是实现定义。

C11:7.21.6(p8):

  

p参数应该是指向void的指针。指针的值以实现定义的方式转换为打印字符序列。

答案 2 :(得分:2)

尝试以问题的精神回答 - 如果你将C ++程序更改为这样,那么它们将是相同的。

int a;

int main (void) {

printf ("%p\n", &a);
cout << &a << endl;

return 0;
}

地址将是相同的,毕竟,这一切都很重要!

C ++代码将引入更多库并启动代码和C ++默认静态数据(cout,cerr,cin等)而不是C代码。因此地址可能会被推到内存中。此外,应用程序的起始地址可能对C和C ++设置不同,或者实际上是随机的。在Visual C ++首选项中,您可以拥有一个&#34;随机化的基地址&#34;或者&#34;固定基地址&#34;设置这些将使int移动一个地址。

答案 3 :(得分:0)

问题不在于陈述,而是两个陈述都应该在同一个程序中。因为在不同的程序中都有不同的地址。在同一个程序中,两者都会打印相同的地址。我知道一个是C语句,而另一个是C ++。但是你可以在同一个程序中使用它们。