gpt4 book ai didi

c - 关于在 printf 函数中使用时指向整数的未初始化指针的行为问题

转载 作者:行者123 更新时间:2023-12-03 21:13:05 27 4
gpt4 key购买 nike

我是这个特定论坛的新手,所以如果有任何令人震惊的格式选择,请告诉我,我会及时更新。

在 C Programming: A Modern Approach(由 K. N. King 撰写)一书中,写了以下段落:

If a pointer variable p hasn't been initialized, attempting to use the value of p in any way causes undefined behavior. In the following example, the call of printf may print garbage, cause the program to crash, or have some other effect:

int *p;
printf("%d", *p);


据我了解指针以及编译器如何处理它们,声明 int *p有效地说,“嘿,如果你将来取消引用 p,我将查看内存中四个连续字节的 block ,其起始地址是 p 中包含的值,并将这 4 个字节解释为有符号整数。”

至于这是否正确......如果它是正确的,那么我对上述代码块的原因有点困惑:
  • 被归类为未定义行为
  • 可能导致程序崩溃
  • 可以有一些其他效果


  • 对上述案例的评论:

    我对 的理解未定义的行为 就是说,在运行时,任何事情都可能发生。话虽如此,在上面的代码中,在我看来,只有非常明确的子集会发生。我了解 p (由于缺乏初始化)正在存储一个随机地址,该地址可以指向内存中的任何位置。然而,当 printf传递了取消引用的值 *p ,编译器不会只查看内存的 4 个连续字节(从任意随机地址开始)并将这 4 个字节解释为有符号整数吗?

    因此, printf应该只做一件事:打印一个范围从 -2,147,483,648 到 2,147,483,647 的数字。显然,这是许多不同的可能输出,但这真的可以称为“未定义的行为”。此外,这种“未定义的行为”如何导致“程序崩溃”或“产生其他影响”。

    任何澄清将不胜感激!谢谢!

    最佳答案

    未初始化值的值为不确定 .它可以保存任何值(包括 0),甚至有可能在您每次尝试读取它时读取不同的值。该值也可能是 陷阱表示 ,这意味着尝试读取它会触发可能导致程序崩溃的处理器异常。

    假设您很幸运并且能够读取 p 的值,由于大多数系统使用的虚拟内存模型,该值可能与映射到进程内存空间的地址不对应。因此,如果您尝试通过取消引用指针来读取该地址,则会触发可能导致程序崩溃的段错误。

    请注意,在这两种情况下,崩溃都发生在 printf 之前。甚至被称为。

    此外,允许编译器假设您的程序没有未定义的行为,并将基于该假设执行优化。这会使你的程序以你意想不到的方式运行。

    至于为什么做这些事情是未定义的行为,那是因为 C standard这么说。特别是,附录 J2 给出了未定义行为的示例:

    The value of an object with automatic storage duration is used while it is indeterminate. (6.2.4, 6.7.9, 6.8)

    关于c - 关于在 printf 函数中使用时指向整数的未初始化指针的行为问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62481146/

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