即使在函数调用完成后,也可以访问堆栈上的内存位置

时间:2016-02-13 13:36:12

标签: c stack

我的节目如下:

#include <stdio.h>
#include <stdlib.h>

int* testPointerReturnType();

int main(void)
{
    int x = 2;
    printf("Value of x is %d and its address is %p\n", x, &x);
    int* y = testPointerReturnType();
    printf("Value of y is %d and its address is %p\n", *y, y);    
}

int* testPointerReturnType()
{
    int x = 33;
    int r = 99;
    return &x;
}

以下是我的整体o / p(我将在下面的问题中讨论这个问题):

// This is with ** int r = 99; ** line commented
jharvard@appliance (~/psets/pset5/pset5_test): ./PointerAddresss 
Value of x is 2 and its address is 0xbfdba7c4
Value of y is 33 and its address is 0xbfdba794
jharvard@appliance (~/psets/pset5/pset5_test): size PointerAddresss
   text    data     bss     dec     hex filename
   1250     280       4    1534     5fe PointerAddresss


// This is with ** int r = 99; ** line un-commented
jharvard@appliance (~/psets/pset5/pset5_test): ./PointerAddresss 
Value of x is 2 and its address is 0xbf8a98e4
Value of y is 33 and its address is 0xbf8a98b4
jharvard@appliance (~/psets/pset5/pset5_test): size PointerAddresss
   text    data     bss     dec     hex filename
   1266     280       4    1550     60e PointerAddresss
jharvard@appliance (~/psets/pset5/pset5_test): 

以下是我的问题:

  1. 我正在返回局部变量的内存地址,但是在该函数执行完毕后我仍然能够访问该位置。怎么样?是否有可能内存位置仍然保留该值并且尚未被覆盖。这意味着如果我的程序只调用了一个函数并且该函数返回了一个内存地址,那么我仍然可以访问本地变量的内存地址并获得相同的值,因为没有调用其他函数吗?
  2. 如果我保留int r = 99;作为评论,那么我会在文字和dec中得到1250。如果我取消注释,那么我得到1266,这基本上意味着增加16个内存位置,但是为什么增加16个内存位置时4个字节的int?另外,我知道文本/代码段然后是什么dec

1 个答案:

答案 0 :(得分:7)

除非堆栈的大小再次增加到足以覆盖该值,否则内存位置仍然可以保留该值,但是您正在基于未定义的行为进行操作。 可能意味着没有其他函数被调用,但可能意味着没有其他函数需要在堆栈上分配那么多空间才能运行。

您看到分配的内存超出预期的原因是堆栈对齐。如果您阅读了适用于您的平台的应用程序二进制接口文档,您会发现这个描述很清楚。

我没有提到这一点,但是如果你将函数中的局部变量标记为static,你仍然会做很糟糕的事情但是你可以通过一个指针在函数调用结束后可靠地继续访问该值因为该值不再在堆栈上分配。

最后,我刚看到你的最后一个问题。 dec表示十进制。如果你将0x60e转换为十进制,你将获得1550。

<小时/> David关于堆栈对齐的更多信息,从他的评论中得出答案 - hagrawal。

  

对于访问元素和for的速度,需要堆栈对齐   呼叫的一致性。这样事情最好在记忆中对齐   快速访问和被叫功能并不需要&#34;奇怪&#34;哪里   事情会发生。这意味着通常会产生分配一个字节   在堆栈上分配2,4,8,16或甚至更多字节,全部   取决于对齐要求。