当我参加面试时,面试官问我这个问题。他们使用堆,堆栈等内存。我用Google搜索但我没有得到任何明确的答案。
答案 0 :(得分:7)
好吧,既然你标记了C
,我就会从那开始。
在C运行时中,全局变量存储在两个位置之一;数据段或BSS段。 您确定特定变量属于哪一个的方式是它是否已初始化。
初始化 全局(和静态)变量进入 数据段 。
未初始化的 全局(和静态)变量进入 BSS段 。
从视觉上看,整个运行时如下所示:
_______
| Text |
|_______|
| Data | <-- Initialized globals / statics
|_______|
| BSS | <-- Uninitialized globals / statics (basically a bunch of 0s)
|_______|
| |
| Stack |
|_______|
| |
| Heap |
|_______|
与运行时创建的 堆栈 和 堆 上的变量不同,全局变量存在程序的可执行映像文件的一部分(a.out
,foobar.exe
)。
答案 1 :(得分:5)
内部$_POST
的值在php_auto_globals_create_post()
内创建,并通过PG(http_globals)[TRACK_VARS_POST]
提供,这只是引用http_globals
的一种方法。
上述http_globals
的定义告诉我们,这是一个zval *
元素数组,每个元素$_POST
,$_GET
,$_COOKIE
等等(数组也存储在zval
容器中。
通过ALLOC_ZVAL()
分配zval
,调用以下函数:
_emalloc()
_malloc()
malloc()
函数在堆上分配内存,因此答案是堆。