You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C语言中调用fork()后字符数组会被复制吗?

在C语言中调用fork()后字符数组是否会被复制?

你的代码输出会是第二种情况:

The message in child is secret message
The message in parent is empty message

原因解析:

当调用fork()创建子进程时,系统会为子进程创建父进程地址空间的**写时复制(Copy-On-Write)**副本。这意味着:

  • 初始状态下,父子进程共享同一块内存空间(包括栈上的msg字符数组),不会立即复制。
  • 当任意一方尝试修改内存内容时,系统才会为修改的内存区域创建独立的副本,确保修改只影响当前进程。

回到你的代码:

  1. 父进程初始化msg为"empty message",然后调用fork()。
  2. 子进程进入else分支,执行strcpy(msg, "secret message")——这一修改触发了写时复制,系统为子进程的msg数组创建独立副本,修改的只是子进程自己的这份数据。
  3. 父进程在wait(0)等待子进程结束后,打印的是自己未被修改的msg,也就是初始的"empty message"。

完整代码:

#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    char msg[50] = "empty message";
    pid_t pid = fork();
    if(pid > 0) {
        wait(0);
        printf("The message in parent is %s\n", msg);
    } else {
        strcpy(msg, "secret message");
        printf("The message in child is %s\n", msg);
    }

    return 0;
}

实际输出:

The message in child is secret message
The message in parent is empty message

内容的提问来源于stack exchange,提问作者Dogu Deniz Ugur

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 04:55:18