fork() 在这个例子中是如何工作的?

How does fork() works in this example?

关于此代码:

#include <stdio.h>
int main(){
    int x = 1;
    if (0 == fork()){
        int x = x + 1;
        fork();
    }
    else{
        int x = 4 * x;
        fork();
    }
    printf("%d",x);
}

我的一些朋友告诉我结果应该是 2244,但是当我尝试 运行 时,我得到 1111

你能帮我理解fork()在这里是如何工作的吗?哪个答案是正确的?

非常感谢!

唯一打印的是 main 定义最外层范围内的 x。它是 1,所以只打印“1”,创建的四个进程各打印一次。

在内部块中,int x = …; 创建了一个与外部 x 不同的新对象,即使它们具有相同的名称。这些对象未打印,因此它们的值无关紧要。

更详细地说,在int x = x + 1;中,初始化器中的x指的是被声明的x,所以这个定义试图在它自己的初始化中使用该对象。此行为未由 C 标准定义,1 因此标准允许该程序在此处严重误入歧途。然而,典型的编译器在这里实现了一些简单的代码,或者忽略初始化,因为它本质上是没有意义的,或者使用恰好已经在为新 x 分配的内存中的任何位来实现 x + 1int x = 4 * x;有同样的问题

脚注

1 由于 C 2018 6.3.2.1 2,它表示当使用未获取地址的未初始化自动对象的值时,行为未定义。