代码之家  ›  专栏  ›  技术社区  ›  CalculusLover

在本例中,fork()是如何工作的?

  •  0
  • CalculusLover  · 技术社区  · 3 年前

    关于此代码:

    #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() 在这里有效,哪个答案是正确的?

    谢谢!

    1 回复  |  直到 3 年前
        1
  •  4
  •   Eric Postpischil    3 年前

    唯一被打印出来的是 x 在最外层的范围内 main 释义它是1,所以只有1个被打印,由创建的四个进程中的每一个打印一次。

    在内部街区内, int x = …; 创建与外部对象不同的新对象 十、 尽管他们有相同的名字。这些对象没有打印出来,因此它们的值无关紧要。

    更详细地说,在 int x = x + 1; 这个 十、 在初始值设定项中,指 十、 声明,因此该定义尝试在其自身初始化中使用该对象。C标准没有定义这种行为, 1. 因此,标准允许该程序在这里严重误入歧途。然而,典型的编译器在这里实现了一些过于简单的代码,要么忽略了初始化,因为它本质上没有意义,要么实现了 x + 1 十、 . int x = 4 * x; 也有同样的问题。

    脚注

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