c++ - 从程序的角度来看,内存段是如何组织的

标签 c++ c function memory

<分区>

首先,我给出了一个 C/C++ 函数的两个代码片段,揭示了 C/C++ 管理内存分配的不同策略。我在求职面试中被问到这些问题。:(

#1

char *func()
{
    char *p = "hello world";
    return p;
}

#2

char *func()
{
    char p[] = "hello world";
    return p;
}

当func返回时,人们还能得到字符串“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      |
|___________________|  
|        HEAP       |
|___________________|  
|   DATA SEGMENT    |
|___________________|  
|  PROGRAM SEGMENT  |
|___________________|  
|        ...        |  
|                   |  

从程序的角度,我不确定这样的内存分区是否正确。 (而且,可能存在存储特定类型数据的其他段。)

最佳答案

正如所写,您的问题过于宽泛,无法完全解决,因此我的目标是在此处解决问题的具体部分。

在第一个示例中,我们返回字符串文字的地址,该地址通常存储在进程内存的只读部分的程序段中。您可以在 this answer 中阅读更多内容.

char *p = "hello world";
return p;

在第二个示例中,我们在堆栈上创建一个字符数组 char[],并通过复制字符串文字来填充它。每当我们在 C 中声明一个非静态数组时,内存总是分配在堆栈上。由于函数返回时堆栈内存有效地消失,指针在函数返回时失效。

char p[] = "hello world";
return p;

在第三个也是最后一个示例中,我们声明了一个静态数组。在函数内部,static 关键字表示变量的生命周期与整个程序的生命周期相等。这就是为什么返回指向这样一个数组的指针是完全有效的,即使它就像第二个示例一样是一个拷贝。

static char p[] = "hello world";

如果你对这类知识感兴趣,我推荐this slide deck供进一步研究。它非常实用,并在面试上下文中讨论了这些问题。

关于c++ - 从程序的角度来看,内存段是如何组织的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24710748/

相关文章:

c++ - 我可以使用 popt 库一次读取两个选项值吗?

c++ - 使用计数器模式用 SHA256 加密数据是否聪明?

c - 二叉树 : Finding the same values

javascript - 当元素的 innerHTML 改变时触发一个函数?

c++ - C++中用于搜索字符串模式的正则表达式

c++ - 如何从文本文件中分离字符串

c - 对包含大量宏的程序进行单元测试

c++ - 如何从整个代码的函数中打开文件?

c++ - 如何使用常量数组从代码中的函数返回 true 或 false?

c++ - 如何将在 OS X 中开发的 Qt 应用程序部署到 Windows?