小编JAN*_*RMA的帖子

数组存储在内存中的什么位置?

我试图了解如何在 C 程序中管理内存。我知道内存中有以下段:

  1. 初始化数据段
  2. BSS
  3. 代码

现在考虑以下程序:

#include <stdio.h>

int main(){
    int arr[4] = {1,2,3,4};
    int x = 10;

    printf("Hello World!");
}

Run Code Online (Sandbox Code Playgroud)

在上面的程序中, arr 和 x 都是在 main 函数中局部声明的。我认为这意味着它们都将在函数堆栈上分配空间。但是,当我在 linux 上运行 size 命令时,我发现数组实际上是在数据段中分配了空间。

我在网上搜索过这个,但发现了相互矛盾的信息。一些答案说所有本地声明的变量都应该进入堆栈,而其他人说数组应该进入堆。我认为如果我使用 malloc 动态分配内存,数组会进入堆,在这个例子中不是这种情况。

c memory-management process

5
推荐指数
2
解决办法
405
查看次数

为什么我们需要 wait() 系统调用?

您好,我是学习系统调用的新手。我目前正在学习 fork() 和 wait() 系统调用。我知道 fork() 创建一个新的子进程。让我困惑的是 wait() 调用。
到目前为止,我的理解是:
(1)当一个进程死亡时,它会进入“僵尸状态”,即它不会释放其PID,而是等待其父进程确认子进程已死亡,然后释放PID
(2) 所以我们需要一种方法来确定子进程何时结束,以便我们不会让任何进程处于僵尸状态

我对以下事情感到困惑:
(1) 当运行一个 C 程序时,我派生了一个新的子进程,如果我不显式调用wait(),当子进程结束时它是在内部完成的吗?因为您仍然可以用 C 语言编写一段代码,在其中运行 fork() 而无需 wait(),并且它似乎工作正常?
(2) wait() 的作用是什么?我知道它返回已终止的子进程的 PID,但这对于释放已终止进程的 PID 有什么帮助/相关呢?

我很抱歉提出这样幼稚的问题,但这是我真的很好奇的事情,而且我在网上找不到任何好的资源!非常感谢您的帮助!

linux operating-system process waitpid

4
推荐指数
1
解决办法
2353
查看次数