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

5
#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。

2
%u?你应该使用%p来打印地址,并将指针强制转换为void *类型。 - ajay
在GCC x64 Linux上具有相同的行为。 - Linuxios
1
至少应该是 int main(void) - alk
4个回答

6
尝试在不同的堆栈深度中调用它,你会得到不同的地址:
void func_which_calls_vaibhav()
{
    vaibhav();
}

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

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

以您的示例为例,每次调用函数vaibhav时堆栈的状态都是相同的。


4

这并非必要,您可能会或者不会得到相同地址的值。请使用%p代替。

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

1
我猜这是因为相同的堆栈帧被回收利用了? - Linuxios

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

在Dev C++中,每次我都得到相同的地址。 - user2738777
@user2738777 是的,可能是这样的。对于所有调用vaibhav()的堆栈虚拟内存分配/释放,都可能导致相同的地址变量a被存储。 - Sunil Bojanapally

0
在函数vaibhav()中,“a”是一个自动变量,这意味着一旦调用此函数,它就会在堆栈中自动创建,并在函数返回时自动释放(对进程无效)。 当funA(这里是主函数)调用另一个funB(这里是vaibhav)时,funB的堆栈帧将为funB分配。当funB返回时,funB的堆栈帧将被释放。
在这种情况下,funB(vaibhav)的堆栈依次被调用3次,每次调用都会分配和释放funB的堆栈帧,然后重新分配并循环利用多次。
相同的内存块在堆栈内存中重复使用了3次。在该块中,“a”的确切内存也重复使用了3次。因此,内存相同,得到相同的地址。
这绝对是与编译器有关的。这取决于编译器实现。但我相信几乎每个C编译器都会产生相同的结果,尽管我敢打赌,C标准对于定义此案例的期望输出没有具体要求。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接