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
之后,我应该为 int
和 malloc()
分配 space,但是使用 fork()
似乎会自动执行此操作。
编辑:
现在我明白了未定义的行为 :)
但现在我要问:这个具体案例的原因是什么?
它不起作用。 (或者更准确地说,你有未定义的行为)
1) fork 只是隐藏了段错误,因为您没有检查子进程的退出代码。
2) 内存分配不是自动的——从来没有!
您只是写入一个随机位置,您可能只是 "lucky" 在第二个版本中随机位置在您的进程中 space。
您的两个代码片段都会调用 undefined behaviour,礼貌,
- 使用未初始化和无效的内存
*n
- (可能)使用未初始化和无效的内存
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]);
问候
此代码出现分段错误:
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
之后,我应该为 int
和 malloc()
分配 space,但是使用 fork()
似乎会自动执行此操作。
编辑: 现在我明白了未定义的行为 :) 但现在我要问:这个具体案例的原因是什么?
它不起作用。 (或者更准确地说,你有未定义的行为)
1) fork 只是隐藏了段错误,因为您没有检查子进程的退出代码。
2) 内存分配不是自动的——从来没有!
您只是写入一个随机位置,您可能只是 "lucky" 在第二个版本中随机位置在您的进程中 space。
您的两个代码片段都会调用 undefined behaviour,礼貌,
- 使用未初始化和无效的内存
*n
- (可能)使用未初始化和无效的内存
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]);
问候