C - 为什么在循环中创建的变量具有相同的内存地址?

wal*_*man 4 c memory memory-address

只是我的问题的一个简单示例:

while(condition){
    int number = 0;
    printf("%p", &number);
}
Run Code Online (Sandbox Code Playgroud)

该变量将始终位于相同的内存地址中。为什么?

那么在循环内部或外部声明它之间的真正区别是什么?

我是否需要malloc每次迭代都使用变量来获得不同的地址?

Bli*_*ndy 9

该变量将始终位于相同的内存地址中。为什么?

这不是必需的,但您的代码非常简单,可能会跨所有平台。具体来说,因为它存储在堆栈中,所以它总是在相对于您的堆栈指针的相同位置。请记住,您不是在此处分配内存(nonewmalloc),您只是在命名现有(堆栈相关)内存。

那么在循环内部或外部声明它之间的真正区别是什么?

在这种情况下,范围。该变量不存在于它所在的大括号之外。同样在大括号之外,如果它适合内存并且编译器选择这样做,另一个变量可以取代它。

我是否需要每次迭代都对变量进行 malloc 以获得不同的地址?

是的,但我还没有看到mallocint一个简单的堆栈变量或标准集合不会做得更好的分配空间的良好用途。

  • 在这种情况下,最好提出一个新问题。 (2认同)

ana*_*ciu 5

该变量将始终位于相同的内存地址中。为什么?

编译器决定变量应该在哪里,考虑到操作系统的限制,将变量保持在相同的地址比在每次迭代时重新定位要有效得多,但理论上这可能会发生。

你不能指望它每次都在同一个地址。

那么在循环内部或外部声明它之间的真正区别是什么?

区别在于变量的生命周期,如果在循环中声明它只会存在于循环中,循环结束后您将无法访问它。

当块的执行结束时,对象的生命周期结束并且不能再被访问。

我是否需要每次迭代都对变量进行 malloc 以获得不同的地址?

malloc 是一个昂贵的操作,在每次迭代时 malloc 变量没有多大意义,也就是说,编译器决定为它分配内存的位置,它很可能在同一地址或不在同一地址。

再一次,您不能依赖上一次迭代中的变量位置来断言它在下一次迭代中的位置。

变量的存储方式有所不同,分配的变量将在堆上,而不是像前一种情况那样在堆栈上。

  • @FiddlingBits,操作系统 (2认同)