【发布时间】:2014-07-12 07:32:43
【问题描述】:
首先,我给出了 C/C++ 函数的两个代码片段,它们揭示了 C/C++ 管理内存分配的不同策略。我在一次求职面试中被问到这些问题。:(
#1
char *func()
{
char *p = "hello world";
return p;
}
#2
char *func()
{
char p[] = "hello world";
return p;
}
当函数返回时,人们还能得到字符串“hello world”吗?
这个答案分别是YES和NO。
因为在#1 中,“hello world”是一个字符串常量。而在#2中,“hello world”的存储位置是STACK。但是这样写的时候,static char p[] = "hello world";,答案是YES。
那么,我的问题是 C/C++ 如何管理函数的内存分配?
回想面试官告诉我的话。我记得类似堆栈/堆/数据段/程序段/*。我希望任何人都可以准确地描述这一点。
谢谢。
添加内容
“了解代码在内存中的管理方式将有助于程序员编写代码。”这是面试官对我说的。
上面给出的示例用于描述这一点。我想问的是从程序的角度来看,内存段是如何组织的。我期待的答案可能会像
|___________________|
| STACK |
|___________________|
| HEAP |
|___________________|
| DATA SEGMENT |
|___________________|
| PROGRAM SEGMENT |
|___________________|
| ... |
| |
从程序的角度来看,我不确定这样的内存分区是否正确。 (而且,可能存在其他存储特定类型数据的段。)
【问题讨论】:
-
Stack Overflow 不是计算机科学学院。
-
从技术上讲,答案是“是”和“也许”。第二个例子是未定义的行为。