【问题标题】:What is the default state of variables?变量的默认状态是什么?
【发布时间】:2009-06-17 12:18:38
【问题描述】:

当 C 程序启动并将变量分配到内存位置时,C 标准是否说明该值是否已初始化?

// global variables
int a;
int b = 0;
static int c;

在上面的代码中,'b'将被初始化为0。'a'的初始值是多少? 'c' 有什么不同,因为它对于这个模块是静态的?

【问题讨论】:

    标签: c memory initialization


    【解决方案1】:

    由于您特别提到了全局变量:对于全局变量,无论是否声明为static,它们都将被初始化为0。

    另一方面,

    Local 变量将是 undefined(除非它们被声明为 static,在这种情况下它们也将被初始化为 0——感谢 Tyler McHenry )。翻译过来,这意味着你不能依赖它们包含任何特定的东西——它们只会包含该位置内存中已经存在的任何随机垃圾,这可能因运行而异。

    【讨论】:

    • 注意静态局部变量也初始化为零。
    【解决方案2】:

    编辑: 以下内容仅适用于局部变量 - 不适用于全局变量。

    变量的初始值未定义。在某些语言中,变量在内存中的位置在声明时会归零,但在 C(和 C++ 中)中,未初始化的变量将包含当时存在于该位置的任何垃圾。

    因此,最好的想法是未初始化的变量很可能包含垃圾并具有未定义的行为。

    【讨论】:

    • 这仅适用于自动持续时间的局部变量。
    • -1,在全局变量的上下文中是错误的。如果帖子更改,请联系我,然后我将删除反对票。
    • 哎呀!我没有注意到“//全局变量”注释。我将进行编辑以反映这一点。
    • 很遗憾,我无法删除我的反对票。 SO说“除非编辑帖子,否则投票删除旧的。” wtf,它被编辑了......另外:垃圾未初始化的自动变量将具有(在最明显的实现中)存储在堆栈中的任何内容。还有一点迂腐:我认为它们的价值是未指定的,而不是程序行为是未定义的。也就是说,变量可以保存任何值,但不允许程序仅仅因为您没有初始化变量而终止(或采取野分支)。
    【解决方案3】:

    a 将为零,c 也将为零,前提是它们是全局的且未显式初始化。对于局部静态变量也是如此。

    只有局部非静态变量没有被初始化。使用 malloc 分配的内存也未初始化。

    请参阅here,了解 C 中不同对象的初始化和分配规则。

    【讨论】:

      【解决方案4】:

      今天早上我打字太慢了。当我回答时,三个人迅速出现,所以我删除了大部分帖子。我找到的链接清晰而简短,所以无论如何我都会发布:Wikipedia on "uninitialized variable" 以讨论基本问题。

      【讨论】:

        【解决方案5】:

        快速测试显示 a 和 c 为 0。

        int a;
        static int c;
        int main() {
            printf("%d %d\n", a, c);
            return 0;
        }
        

        a(和c)的位置在编译时确定;也就是说,它们既没有放在堆栈上,也没有放在 malloc 返回的内存间隔中。我认为 C 标准说它们在所有情况下都被初始化为 0。

        我对@9​​87654322@ 有99.9% 的信心,对a 有98% 的信心。关键字static,在全局变量的上下文中,实际上类似于(比如)C++ 和Java 中的private:它是关于可见性,而不是存储位置。

        Andrew Hare 关于未初始化变量的说法对于存储在堆栈或 malloc 内存中的数据是正确的。对于静态存储的变量,情况并非如此。

        【讨论】:

        • C 语言标准保证了这种行为是对的,但是恐怕你的“测试”并没有真正测试这一点——想象一下如果 C 没有将全局变量设置为 0,但是碰巧的是,当您运行程序时,a 和 c 所在的内存中的值已经包含 0。
        • 在调试模式下,现代调试器会用某种位模式填充内存,因此如果您还没有初始化变量,您会立即知道这一点。例如,Visual Studio 就是这样做的。
        • @codymanix:好点。 (小问题:我相信(至少对于 MSVC++)调试编译的 .EXE 会使用该位模式本身初始化内存,即不管外部调试器是否正在运行。)
        猜你喜欢
        • 1970-01-01
        • 2020-04-12
        • 1970-01-01
        • 2011-01-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-19
        相关资源
        最近更新 更多