假设我定义了以下代码:
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的内存本身肯定会继续存在,但指针变量具有本地范围。为什么我能得到这个指针?
答案 0 :(得分:2)
p
只是一个指针,指向您已分配的内存块。
已分配块的生命周期超出了函数的末尾。
实际的指针确实会在返回时超出范围,但在此之前你已经将它的副本返回给调用者。
而且,顺便说一下,你可能意味着
int*
(在两种情况下)而不是*int
和(*int)
。在任何情况下,您都不希望在C中显式转换malloc
的返回值 - 它可以隐藏细微的错误。 C完全能够将void *
返回的malloc
转换为任何合适的指针类型。
最好写成:
int *func (void) {
int *p = malloc (sizeof (int));
return p;
}
您还会注意到在函数中使用void
来显式声明函数不带参数。这比仅仅()
略有不同(不确定参数数量)更可取。
答案 1 :(得分:0)
最后理解之后......我能够得到这个概念。
当我们返回指针p ...肯定是p,它被分配了 在堆栈上消失。
由于值是通过值调用机制返回的,而p是持有地址 在堆上分配的内存。该地址仍然有效,并且保留对有效内存位置的引用。
因此p本身消失了,但是它返回的值被复制到调用函数中的变量,因此这证明了代码的正确性。