gpt4 book ai didi

c - 没有出现段错误

转载 作者:行者123 更新时间:2023-11-30 21:45:46 32 4
gpt4 key购买 nike

考虑这个简单的代码片段:

  {  
if(fork())
{
printf("Parent terminated\n");
}
else
{
char *s = "hello world";
*s = 'H';
printf("child terminated\n");
}
wait(NULL);
return 0;
}

当我编译它时,我在分配给 *s 时没有得到我们预期的段错误错误输出是:父终止(不打印子终止)

现在,如果我删除两行 char *s=......'H' 我会得到正常的输出。
有人可以解释一下

最佳答案

首先,不能保证您会遇到段错误或任何定义的行为来触发未定义的行为,例如修改字符串文字。虽然在 Linux 上,字符串文字被放入只读内存中,所以在 Linux 上修改它们通常会导致段错误。

那么为什么这段代码不会触发段错误呢?确实如此,但你只是看不到它,因为你 fork 了。

当您的 shell(例如 bash)检测到时,通过调用 wait 来打印“段错误(核心转储)”消息。 ,当它生成的进程以 SIGSEGV 终止时(段错误)信号。但是,您的 shell 将不会收到有关子进程退出的任何通知;你的父进程将会。

您的父进程调用wait等待并在终止时获取退出代码。如果您没有通过传入 NULL 来忽略退出代码等待,您可能会看到退出代码是 -11 ,或-SIGSEGV .

所以这是段错误;您的父进程只是忽略了子进程发生段错误的通知。

关于c - 没有出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34224176/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com