微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么每个值都没有初始化为 0?

如何解决为什么每个值都没有初始化为 0?

#include <stdio.h>

int main(void) {
    int memo[1000];
    for (int i = 0; i < 1000; i++) {
        printf("%d\t",memo[i]);
    }
    return 0;
}

我认为一切都应该初始化为 0,但事实并非如此。 这有什么原因吗? 非常感谢您的帮助。

解决方法

在函数体中自动存储在本地定义的对象在 C 中未初始化。值可以是任何东西,包括某些架构上的陷阱值,这些值仅通过读取它们就会导致未定义的行为。

您可以将此数组初始化为 0。第一个元素显式初始化为 0,其余所有元素也将初始化为 0,因为任何缺少初始化器的元素都将设置为 int memo[1000] = { 42 };

为了完整起见,42 将其第一个元素设置为 0,其余所有元素设置为 int memo[1000] = { [42] = 1 };。同样,C99 初始值设定项 1 将其第 43 个元素设置为 0,所有其他元素设置为 iterator

,

在 C 中,当你这样做时

int memo[1000];

您正在内存中分配 1000 个小点。这些点目前可能已经或可能没有保存一些垃圾数据。因此,初始化所有变量通常被认为是一种很好的做法。这将使调试更容易。

您可以将上面的行替换为,

int memo[1000] = {0};

将数组的每个元素初始化为0;

编辑:正如此处的其他答案所讨论的那样,您所经历的行为肯定有更深层次的原因。但是,如果您是 C 或一般编程的初学者。这足以让您开始使用带有初始化的数组,而不会被更复杂的细节所淹没。如果您更高级,请参考其他答案。

,

来自 C 标准(6.7.9 初始化)

10 如果有自动存储期的对象没有初始化 明确地,它的值是不确定的。如果一个对象具有静态 或者线程存储时长没有显式初始化,则:

——如果是指针类型,则初始化为空指针;

——如果它有算术类型,它被初始化为(正数或 无符号) 零;

——如果是聚合,则每个成员都被初始化(递归) 根据这些规则,任何填充都被初始化为零位;

——如果是联合,则初始化第一个命名成员 (递归地)根据这些规则,并初始化任何填充 到零位;

19 ...所有未显式初始化的子对象应为 隐式初始化与具有静态存储的对象相同 持续时间。

因此在这个程序中

#include <stdio.h>

int main(void) {
    int memo[1000];
    for (int i = 0; i < 1000; i++) {
        printf("%d\t",memo[i]);
    }
    return 0;
}

数组 memo 具有自动存储持续时间,并且根据 C 标准提供的引用,其元素具有不确定的值。

你可以像这样声明数组

    int memo[1000] = { 0 };

在这种情况下,数组的第一个元素显式初始化为 0,所有其他元素也隐式初始化为 0。

您可以选择要显式初始化的数组元素,例如

    int memo[1000] = { [999] = 0 };

如果你会写

#include <stdio.h>

int memo[1000];

int main(void) {
    for (int i = 0; i < 1000; i++) {
        printf("%d\t",memo[i]);
    }
    return 0;
}

#include <stdio.h>

int main(void) {
    static int memo[1000];
    for (int i = 0; i < 1000; i++) {
        printf("%d\t",memo[i]);
    }
    return 0;
}

然后数组的元素将被零初始化,因为在文件范围内或使用存储说明符 static 声明的变量具有静态存储持续时间。

,

我认为一切都应该初始化为 0,但事实并非如此。有什么原因吗?

可能有更多原因,但首先您必须了解 C 的工作原理。与 Java 和许多其他语言不同,C 没有模拟器/虚拟机/迭代器。因此,编译器必须完成初始化数组的所有工作。对于某些嵌入式系统来说,这样做会很痛苦。第二,为什么第一个是真的?在资源最少的嵌入式芯片中使用 C 的两个原因,以及历史上,如果您在引入标准之前编写了代码,那么为今天存在的标准编译您的代码将是痛苦的,如果您需要在编译器上初始化。 C 已标准化以考虑较旧的架构。

我建议您阅读以下内容: What happens to a declared,uninitialized variable in C? Does it have a value?

仔细阅读接受的答案,并将其乘以数组的大小。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。