Cal*_*ver 1 c operating-system fork process
关于此代码:
#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);
}
Run Code Online (Sandbox Code Playgroud)
我的一些朋友告诉我结果应该是2244,但是当我尝试运行它时,我得到了1111。
您能帮我了解如何fork()在这里工作吗?哪个答案是正确的?
多谢!
唯一打印的内容位于定义x的最外层范围内main。它是 1,因此仅 \xe2\x80\x9c1\xe2\x80\x9d 被打印,由创建的四个进程中的每一个打印一次。
在内部块内部,int x = \xe2\x80\xa6;创建一个与外部块不同的新对象x,即使它们具有相同的名称。这些对象不会被打印,因此它们的值是不相关的。
更详细地说,在 中int x = x + 1;,x初始化器中的 指的是x正在声明的对象,因此此定义尝试在其自己的初始化中使用该对象。C 标准没有定义这种行为,1因此标准允许程序在这里严重误入歧途。然而,典型的编译器在这里实现一些简单的代码,要么忽略初始化,因为它本质上毫无意义,要么x + 1使用为新分配的内存中已经存在的任何位来实现x。int x = 4 * x;有同样的问题。
1由于 C 2018 6.3.2.1 2,它表示当值用于未获取地址的未初始化自动对象时,未定义行为。
\n