fork 没有分段错误

No segmentation fault with fork

此代码出现分段错误:

int main(int argc, char *argv[]){
    int *n; 
    *n = atoi(argv[1]);
    printf("n: %d \n", *n);
    return 0;
}

虽然这有效:

int main(int argc, char *argv[]){
   int *n; 
   *n = atoi(argv[1]);
   pid_t pid = fork();
   if (pid == 0)
     return 0;
   else
     printf("n: %d \n", *n);
   return 0;
}

为什么第二个用叉子工作?我知道在 int *n 之后,我应该为 intmalloc() 分配 space,但是使用 fork() 似乎会自动执行此操作。

编辑: 现在我明白了未定义的行为 :) 但现在我要问:这个具体案例的原因是什么?

它不起作用。 (或者更准确地说,你有未定义的行为)

1) fork 只是隐藏了段错误,因为您没有检查子进程的退出代码。

2) 内存分配不是自动的——从来没有!

您只是写入一个随机位置,您可能只是 "lucky" 在第二个版本中随机位置在您的进程中 space。

您的两个代码片段都会调用 undefined behaviour,礼貌,

  1. 使用未初始化和无效的内存*n
  2. (可能)使用未初始化和无效的内存 argv[1](如果 argc 不是 >=2

分段错误是 UB 众多副作用之一。 UB 案例也包括 无缝工作 场景。

Why the second with the fork works?

fork() UB有无无关。 TL;DR.

but using the fork() seems to do this automatically.

视觉效果可能具有欺骗性。不要把钱放在 UB 上。

因为 n 未初始化,因此指向未知的内存地址,您正在调用未定义的行为。它可能会崩溃(如第一个示例),也可能不会(如第二个示例)。

在这种情况下,像添加一个未使用的变量这样简单的事情就可能导致程序崩溃,而这在以前是没有的,反之亦然。

n分配内存,你就不会有那个问题了。

编辑:

当你 运行 第二个程序时 运行ning ./test 100 工作的事实,无论多少次,都是运气问题。事实上,您添加了对 fork 的调用(在本例中)恰好重新安排了内存的布局方式,以便它可以工作。稍后您可能决定调用 printf 进行额外调试,突然间它又开始崩溃了。

添加 fork 调用不会自动分配任何 space。

防止崩溃的唯一方法是为 n 分配内存,并确保 argc 至少为 2,以便 argv[1] 指向某个有意义的地方。

当 运行 fork 和 returns 0 时,你没有看到段错误,你的代码永远不会运行 printf ("% d", *n)

当您尝试访问不允许的内存位置时会发生分段错误,因此解决方案是通过 malloc 或 calloc 函数分配 ana 内存,否则仍然会出现问题。 试试这个:

 n=malloc(sizeof(int));
 *n=atoi(argv[1]);

问候