C 从*(int*)0='生成什么信号;X';;
下面的代码在C中具体做什么(或尝试做什么)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
会产生什么样的信号?它会是一个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)
fromsignal.h
*(int*)0='X'的行为代码>未定义
编译器可以随心所欲地做任何事情。(i) 提出SIGSEGV,(ii)根本不编译行有两种可能性
要明确生成故障,请根据需要使用raise
(在
中定义)。是的,在大多数POSIX系统上,您将获得SIGSEGV。还有什么特别的原因,你不能编译它,自己测试它吗?要生成信号,你必须显式地生成它们。未定义的行为在这方面是不可靠的。也许与@SamVarshavchik相关的测试不是一种获得关于C语言指定内容的明确答案的合适方法。未定义的行为有允许任何事情发生的恼人习惯。@chux-我的硬件坏了-是我设计的:)
fish: "./segv" terminated by signal SIGSEGV (Address boundary error)