C动态内存与堆栈内存变量

时间:2016-02-07 21:46:05

标签: c arrays memory memory-management

使用malloc创建C数组时,数组存储在堆中,当静态创建C数组时,它存储在堆栈中。但是,如果从函数中返回静态初始化的C数组元素会发生什么?我的措辞可能很奇怪,所以这里有一个例子:

btn-post-announcement

那么内存中的staticElement在哪里? staticArray是否已从堆栈中清除,因为函数已完成,或者它是否仍在堆栈上,因为staticArray的元素已被返回?
注意:我知道我没有释放动态数组,并且正在泄漏内存,这只是一个例子,并不打算使用。

1 个答案:

答案 0 :(得分:3)

在C中,如果您从某个函数返回charint,那么您将从该函数返回该值的副本,而非实际对象本身。换句话说,如果返回一个声明为局部变量的数组的元素,那么你真的会返回该数组元素的副本,所以即使在原始数组被销毁的时候也会#&# 39;不用担心你以某种方式"失去"那个数组元素。类似地,如果返回分配有malloc的数组的元素,则返回数组元素的副本而不是元素本身。这就是为什么你没有在上面的代码中得到垃圾值。

传回的值不一定存储在堆栈或堆中。它通常存储在某个地方的寄存器中。从语言的角度来看,它具有自动存储持续时间,因此将自动清理。由于您将该值存储在局部变量中,因此它将存储在堆栈中(或者,从技术上讲,它具有自动存储持续时间),但这是因为您将其放在局部变量中并具有与它最初是动态或静态分配的数组这一事实无关。

也就是说, 泄露了内存,因为您永远不会free使用malloc分配的数据。