gpt4 book ai didi

c - 为什么当 *(int *)(0) = 0 时 printf 不起作用;存在

转载 作者:行者123 更新时间:2023-11-30 20:46:00 25 4
gpt4 key购买 nike

我有以下代码:

main ()
{
printf("Hello world !");
*(int *)(0) = 0;
}

当我编译此代码并运行时,它没有将字符串打印到控制台。之后我修改了一下:

main ()
{
printf("Hello world !\n");
*(int *)(0) = 0;
}

而且,它成功了!

我认为背后的 secret 是*(int *)(0) = 0;但不知道为什么!

诗。我使用 gcc 4.8.2 进行编译。

最佳答案

直接原因是 FILE * 操作是缓冲的,尤其是 stdout 通常是行缓冲的(至少在交互时)。如果没有看到 \n 并且在崩溃之前没有显式调用 fflush,则实际上不会将任何内容写入底层文件描述符。

更大的问题是取消引用NULL指针是未定义行为。对于可能发生的事情绝对没有任何限制。如果编译器可以证明printf总是返回,那么就允许UB传播到调用之前,从而形成整个main UB。也就是说,编译器很难证明这一点,特别是因为 FILE 通常涉及 vtable,所以实际上并不正确。但关键是你甚至不能相信 UB 会等到特定时间。

关于c - 为什么当 *(int *)(0) = 0 时 printf 不起作用;存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31017693/

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