C 从*(int*)0='生成什么信号;X';;

C 从*(int*)0='生成什么信号;X';;,c,C,下面的代码在C中具体做什么(或尝试做什么) 会产生什么样的信号?它会是一个SIGSEGV吗?将其放入一个完整的程序中,segv.c: int main( void) { *(int *) 0 = 'X'; return 0; } 并编制: clang -Oz -Wno-error -s -o segv segv.c 现在,当我在64位GNU/Linux系统上运行它时,我确实遇到了一个分段错误: fish: "./segv" terminated by signal S

下面的代码在C中具体做什么(或尝试做什么)


会产生什么样的信号?它会是一个SIGSEGV吗?

将其放入一个完整的程序中,segv.c:

int
main(
    void)
{
    *(int *) 0 = 'X';
    return 0;
}
并编制:

clang -Oz -Wno-error -s -o segv segv.c
现在,当我在64位GNU/Linux系统上运行它时,我确实遇到了一个分段错误:

fish: "./segv" terminated by signal SIGSEGV (Address boundary error)
但是,如果您试图生成分段错误,正如一些评论中的人所指出的,您应该使用
raise(3)
from
signal.h
*(int*)0='X'的行为未定义

编译器可以随心所欲地做任何事情。(i) 提出SIGSEGV,(ii)根本不编译行有两种可能性


要明确生成故障,请根据需要使用
raise
(在
中定义)。

是的,在大多数POSIX系统上,您将获得SIGSEGV。还有什么特别的原因,你不能编译它,自己测试它吗?要生成信号,你必须显式地生成它们。未定义的行为在这方面是不可靠的。也许与@SamVarshavchik相关的测试不是一种获得关于C语言指定内容的明确答案的合适方法。未定义的行为有允许任何事情发生的恼人习惯。@chux-我的硬件坏了-是我设计的:)
fish: "./segv" terminated by signal SIGSEGV (Address boundary error)