2

假设我定义了以下代码:

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 的内存本身肯定应该继续存在,但是指针变量具有本地范围。我怎么能得到这个指针?

4

2 回答 2

4

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

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

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

而且,顺便说一句,您可能指的是int*(在这两种情况下)而不是*intand (*int)。无论如何,您都不想malloc在 C 中显式地转换返回值——它可以隐藏细微的错误。C 完全能够将void *返回的 bymalloc转换为任何合适的指针类型。

最好写成这样:

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

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

于 2012-08-27T08:18:08.747 回答
2

终于在理解之后......我能够得到这个概念。

  1. 当我们返回指针 p... 时,在堆栈上分配的 p 肯定会消失。

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

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

于 2012-08-29T09:19:10.487 回答