C++ 为什么局部变量的地址对于不同的执行是相同的?

C++ 为什么局部变量的地址对于不同的执行是相同的?,c++,C++,这里loc是一个局部变量,在函数f10第一次执行后超出范围,然后再次分配给fun11的下一次执行。因此,根据我的理解,loc变量的地址必须不同。那么为什么两次执行的地址和loc都相同呢?每次调用fun都需要自己的位置来存储变量。但一旦函数返回,变量就不再存在。没有理由不能重复使用这个地址。不一定要这样,但没有理由不这样 在典型的实现中,堆栈空间用于保存调用函数时从函数及其局部变量返回所需的信息。当函数返回时,局部变量从堆栈中移除,返回信息从堆栈中弹出,使堆栈回到调用函数时的位置。由于这两个函数调

这里loc是一个局部变量,在函数f10第一次执行后超出范围,然后再次分配给fun11的下一次执行。因此,根据我的理解,loc变量的地址必须不同。那么为什么两次执行的地址和loc都相同呢?

每次调用fun都需要自己的位置来存储变量。但一旦函数返回,变量就不再存在。没有理由不能重复使用这个地址。不一定要这样,但没有理由不这样

在典型的实现中,堆栈空间用于保存调用函数时从函数及其局部变量返回所需的信息。当函数返回时,局部变量从堆栈中移除,返回信息从堆栈中弹出,使堆栈回到调用函数时的位置。由于这两个函数调用是相同的,因此在这两种情况下,它们的堆栈都是相同的,从而使局部变量具有相同的地址。这是一个有经验的程序员所期望的,但不是依赖的。

每次调用fun都需要自己的位置来存储变量。但一旦函数返回,变量就不再存在。没有理由不能重复使用这个地址。不一定要这样,但没有理由不这样


在典型的实现中,堆栈空间用于保存调用函数时从函数及其局部变量返回所需的信息。当函数返回时,局部变量从堆栈中移除,返回信息从堆栈中弹出,使堆栈回到调用函数时的位置。由于这两个函数调用是相同的,因此在这两种情况下,它们的堆栈都是相同的,从而使局部变量具有相同的地址。这是一个有经验的程序员所期望的,但不是依赖的。

存储在堆栈中的局部变量一个特殊的内存区域,新的推送变量保持在顶部,旧的变量保持在底部。当您调用函数时,会执行一些操作,例如存储返回地址、参数和寄存器等,但有一个顺序。在返回时,所有被推送的变量都从堆栈中弹出。由于在两次调用之间使用同一个函数,因此在主函数中不使用任何局部变量,这是因为变量地址是相同的。

存储在堆栈中的局部变量一个特殊的内存区域,新推送的变量保持在顶部,旧变量保持在底部。当您调用函数时,会执行一些操作,例如存储返回地址、参数和寄存器等,但有一个顺序。在返回时,所有被推送的变量都从堆栈中弹出。由于您使用的是同一个函数,并且在两次调用之间,您在主函数中不使用任何局部变量,因此您的变量地址应该是相同的。

这是对堆栈上发生的事情的一个有点过于简单的模糊说明

main假设0xtopomain保持不变:

0xbfb8e610 
0xbfb8e610
首次执行趣味推送:

再次执行趣味推送:

   ~Stack~
==============
= 0xtopomain = <- Where the hell is loc?!!
= 0x........ =
==============

对堆栈上发生的事情的一个有点过于简单的模糊说明

main假设0xtopomain保持不变:

0xbfb8e610 
0xbfb8e610
首次执行趣味推送:

再次执行趣味推送:

   ~Stack~
==============
= 0xtopomain = <- Where the hell is loc?!!
= 0x........ =
==============

所以地址必须不同。你怎么会这样想?因为它们被依次调用,它们可以使用堆栈上的相同空间。那么,还有什么变量呢两次寻欢作乐之间没有什么区别。如果您从堆栈中取出某些内容,然后立即将其放回,它将位于同一位置。@SubiSuresh内存位置是虚拟的“你认为你现在呼吸的是空气吗?”@SubiSuresh:同一个内存不能被另一个进程使用,因为操作系统不允许。同一个地址可以被另一个进程使用,但它将访问完全不同的内存。操作系统可以为进程创建任意数量的不同或部分重叠的内存空间,并可以根据需要将这些空间的位和块映射到物理内存页中。如果你真的想服用红色药丸,请阅读fork是如何使用copy-on-write实现的。因此地址必须不同。你怎么会这样想?因为它们被依次调用,它们可以使用堆栈上的相同空间。那么,还有什么变量呢两次寻欢作乐之间没有什么区别。如果您从堆栈中取出某些内容,然后立即将其放回,它将位于同一位置。@SubiSuresh内存位置是虚拟的“你认为你现在呼吸的是空气吗?”@SubiSuresh:同一个内存不能被另一个进程使用,因为操作系统不允许。同一个地址可以被另一个进程使用,但它将访问完全不同的内存。op
系统可以为进程创建任意数量的不同或部分重叠的内存空间,并可以根据需要将这些空间的位和块映射到物理内存页中。如果你真的想服用红色药丸,请阅读有关如何使用写时拷贝实现fork的内容。>非常感谢图片化>非常感谢图片化
   ~Stack~
==============
= 0xtopomain = <- Where the hell is loc?!!
= 0x........ =
==============
   ~Stack~
==============
= 0xothers.. =
= 0xbfb8e610 = <- loc's here again
= 0xmemoffun = <- other memory allocated for fun()
= 0xtopomain =
= 0x........ =
==============