为什么我得到相同的地址价值?

时间:2014-02-17 18:24:36

标签: c

#include<stdio.h>
#include<conio.h>

void vaibhav()
{
    int a;
    printf("%u\n",&a);
}

int main()
{
    vaibhav();
    vaibhav();
    vaibhav();
    getch();
    return 0;
} 

每次我获得变量a地址的相同值。

这个编译器是否依赖?我正在使用dev c ++ ide。

4 个答案:

答案 0 :(得分:6)

尝试从不同的堆栈深度调用它,您将获得不同的地址:

void func_which_calls_vaibhav()
{
    vaibhav();
}

int main()
{
    vaibhav();
    func_which_calls_vaibhav();
    return 0;
}

函数中局部变量的地址取决于调用函数时执行点的堆栈状态(SP寄存器的值)。

在您的示例中,每次调用函数vaibhav时,堆栈的状态都完全相同。

答案 1 :(得分:4)

没有必要。您可能会或可能不会获得相同的地址值。并改用%p

 printf("%p\n", (void *)&a);

答案 2 :(得分:1)

您应该使用%p格式说明符来打印变量的地址。 %u&amp; %d用于显示整数值。每次调用函数vaibhav()时,堆栈上的地址都可以相同或不同。

答案 3 :(得分:0)

&#34;&#34;在函数中,vaibhav()是一个自动变量,这意味着一旦调用了这个乐趣就会在堆栈中自动创建,并在返回乐趣后自动释放(对过程无效)。 当funA(这里是main)调用另一个funB(这里是vaibhav)时,funB的堆栈帧将被分配给funB。当funB返回时,funB的堆栈帧被释放。

在这种情况下,funB(vaibhav)的堆栈按顺序被称为3次,正好是一个接一个。在每次调用中,funB的堆栈帧被分配和释放。然后重新分配和回收次数。

堆栈存储器中的相同存储器块重复使用3次。在那个区块中,&#34; a&#34;的确切记忆。也被重复使用了3次。因此,相同的内存和你得到相同的地址。

这绝对是编译器依赖的。这取决于编译器的实现。但我相信几乎每个C编译器都会产生相同的结果,但我敢打赌,C标准中没有特定的要求来定义这种情况的预期输出。