gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 07:03:34 26 4
gpt4 key购买 nike

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

#include <stdio.h>
#include <stdlib.h>
char getStaticElement();
char getDynamicElement();

int main() {
char dynamicElement = getDynamicElement();
char staticElement = getStaticElement();
printf("Dynamic Element: %c\n", dynamicElement);
printf("Static Element: %c\n", staticElement);
return 0;

}
char getStaticElement() {
char staticArray [] = {'a','b','c'};
return staticArray[1]; // returns b
}
char getDynamicElement() {
char * dynamicArray = malloc(sizeof(char)*4);
dynamicArray [0] ='a';
dynamicArray [1] ='b';
dynamicArray [2] ='c';
dynamicArray [3] ='\0';
return dynamicArray[1]; // returns b
}

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

最佳答案

在 C 语言中,如果您从一个函数返回一个 charint,您就是从该函数返回一个该值的副本 ,而不是实际对象本身。换句话说,如果返回声明为局部变量的数组元素,实际上返回的是该数组元素的副本,因此即使原始数组被销毁,也不必担心您以某种方式“丢失”了该数组元素。类似地,如果返回使用 malloc 分配的数组元素,则返回的是数组元素的副本,而不是元素本身。这就是为什么您没有在上面的代码中取回垃圾值。

返回的值不一定存储在堆栈或堆中。它通常存储在某处的寄存器中。从语言的角度来看,它具有自动存储期限,因此会自动清理。由于您将该值存储在局部变量中,因此它将存储在堆栈中(或者更专业地说,它具有自动存储持续时间),但那是因为您将它放在局部变量中并且与事实无关它最初位于动态或静态分配的数组中。

也就是说,您正在泄漏内存,因为您从未释放您使用malloc分配的数据。

关于C 动态内存与堆栈内存变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35259509/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com