【发布时间】:2016-02-07 21:46:05
【问题描述】:
当使用 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 标准不需要堆栈或堆。你能指望什么?为什么?
-
我想知道为什么我不必担心 staticElement 在内存中的位置,尽管函数 getStaticElement 已经结束了
-
另外,我不知道 C 标准不需要堆栈或堆,我很抱歉,我的教授告诉我们,如果 C 程序变量不是动态创建的(malloc , calloc, realloc ...) @Olaf
-
@Turtle 几乎每个人都使用术语“堆栈”和“堆”来表示这样的事情。 C 规范使用“自动存储持续时间”和“动态存储持续时间”这两个术语,它们更具技术性、更便携,但在口语中使用频率较低。
-
你的教授谈到了一个具体的实现。然而,现代编译器使用高级寄存器分配甚至在寄存器中保存和传递(小)数组和
structs 也是错误的。他可能想更新他从 80 年代至今的知识。 (我非常了解这样的导师)。事情远没有过去那么简单。
标签: c arrays memory memory-management