本地C指针变量

时间:2012-08-27 08:12:34

标签: scope stack heap local

假设我定义了以下代码:

int *func()
{
    int *p=(int *)malloc(sizeof(int)); // memory is allocated from heap
                                      // which can be accessed anytime.

    return p;    // but we created p which has a local scope and vanishes as
                 //soon as function exits.  
}

那么这件事怎么样? p是一个局部变量(一个指向地址的指针) 动态记忆)。我的意思是来自HEAP的内存本身肯定会继续存在,但指针变量具有本地范围。为什么我能得到这个指针?

2 个答案:

答案 0 :(得分:2)

p只是一个指针,指向您已分配的内存块。

已分配块的生命周期超出了函数的末尾。

实际的指针确实会在返回时超出范围,但在此之前你已经将它的副本返回给调用者。

  

而且,顺便说一下,你可能意味着int*(在两种情况下)而不是*int(*int)。在任何情况下,您都不希望在C中显式转换malloc的返回值 - 它可以隐藏细微的错误。 C完全能够将void *返回的malloc转换为任何合适的指针类型。

最好写成:

int *func (void) {
    int *p = malloc (sizeof (int));
    return p;
}

您还会注意到在函数中使用void来显式声明函数不带参数。这比仅仅()略有不同(不确定参数数量)更可取。

答案 1 :(得分:0)

最后理解之后......我能够得到这个概念。

  1. 当我们返回指针p ...肯定是p,它被分配了 在堆栈上消失。

  2. 由于值是通过值调用机制返回的,而p是持有地址 在堆上分配的内存。该地址仍然有效,并且保留对有效内存位置的引用。

  3. 因此p本身消失了,但是它返回的值被复制到调用函数中的变量,因此这证明了代码的正确性。