【问题标题】:Variable default values可变默认值
【发布时间】:2014-07-05 06:23:19
【问题描述】:

我对 C 编程中的一些基本理论感到困惑:

  1. 不同数据类型的变量的默认值是多少?示例:如果我声明如下,根据传奇 Dennis Ritchie 博士记录的标准 C 手册,结果可能是什么?

    int x;
    printf("%d",x);
    

    我知道一些 GCC 编译器会打印 0 和一些垃圾值。这取决于编译器。请根据 Dennis Ritchie C 编程文档给我唯一的答案。

    同上,请给我关于float、char、double、string、array和pointers的答案。

  2. 如果我声明并打印指针如下:

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

    屏幕上会打印什么?我使用了 MinGW GCCcompiler 3.4.2 版,其中我得到了一个垃圾值。请帮助我解决这些困惑。

谢谢。

【问题讨论】:

  • printf("%d", pt); 具有未定义的行为; "%d" 需要 int 类型的参数。打印指针值:printf("%p", (void*)pt);
  • 请注意,Messrs Ritchie 等人已经有一段时间没有参与进来了。当前的黄金标准是 ISO C。搜索它。有很多网站可以找到这个简单问题的答案。

标签: c default-value


【解决方案1】:

本地(非静态)变量的值是不确定的,即您无法分辨它们的值。使用未初始化的非静态局部变量会导致 undefined behavior

全局变量和静态局部变量都是零初始化的。除非在声明时初始化。

【讨论】:

    【解决方案2】:

    默认值:

    • 静态局部变量:0
    • 静态全局变量:0
    • 非静态全局变量:0
    • 非静态局部变量:无

    函数中非静态局部变量的地址取决于调用函数时执行点的堆栈状态(SP 寄存器的值)。

    换句话说,这个地址在整个程序执行过程中不是恒定的,给这个变量设置一个默认值实际上意味着向程序添加代码。

    所以标准并没有为非静态局部变量定义默认值,是为了让程序员可以选择是否添加这段额外的代码。

    所有其他类型的变量确实在整个程序执行过程中在内存中都有常量地址,因此将它们设置为默认值并不意味着向程序添加代码(它们的初始值是本质上是可执行映像的一部分)。

    【讨论】:

    • 全局变量(带或不带 static 关键字)具有静态存储持续时间。这意味着它们将被零初始化。
    • @sharth:是的,当你评论时,我正要改变它;谢谢。
    猜你喜欢
    • 2011-11-12
    • 2021-08-18
    • 1970-01-01
    • 2011-08-27
    • 2021-02-20
    • 1970-01-01
    • 2012-06-25
    • 1970-01-01
    相关资源
    最近更新 更多