【问题标题】:C - 2d array not being initialised with zeros [duplicate]C-未用零初始化的二维数组[重复]
【发布时间】:2020-06-17 17:56:20
【问题描述】:

示例 A:length 是某个整数变量

int values[length][2];

这个数组不会把里面的所有元素都设为零。

示例 B:

int values[10][2];

这个将全部设置为零。

我的主要问题是如何将第一个初始化为零?

但是,如果有人可以解释为什么行为不同,我想知道吗?

【问题讨论】:

  • 如果它们是局部变量(第一个必须是),那么 noither 不会被初始化为任何值。您可以使用int values[10][2] = { 0 }; 显式初始化第二个,但不能使用第一个。您必须使用memset 或循环。

标签: c arrays


【解决方案1】:

在块范围内(即在函数或封闭块内)定义的任何变量都不会被隐式初始化。它的值是不确定的。您的两个示例都是这种情况。仅仅因为值恰好为 0 并不意味着它们已被初始化。

如果数组是不是可变长度数组,你可以像这样初始化它:

int values[10][2] = {{ 0 }};

这会将二维数组的一个元素显式初始化为 0,并将其余元素隐式初始化为 0。

然而,VLA 不能显式初始化。所以你应该使用memset 将字节设置为0。

int values[length][2];
memset(values, 0, sizeof values);

【讨论】:

  • 你能在这里做sizeof values 吗?编译时未知。
  • @WeatherVane 是的,它是一个本地数组,所以它获取数组的大小。此外,由于它是 VLA,sizeof 运算符在运行时而不是编译时进行评估。
  • 我删除了评论,因为我刚刚注意到我的错误......你完全正确,memset 的使用完全符合我的要求
  • 只是在另一个注释中:数组是 2d 的事实是否无关紧要? 1d 中预期的行为是否完全相同? @dbush
  • @walkman 没错。它适用于任何类型的任何变量。
【解决方案2】:

尝试使用 calloc 它将垃圾内存初始化为 0

【讨论】:

    【解决方案3】:

    问题是,如果幸运的话,它可能会被初始化为 0,具体取决于您使用的编译器。 最简单的可能是:

    memset(values, '\0', sizeof(int) * length * 2);

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-09
      • 1970-01-01
      • 2021-11-20
      • 1970-01-01
      • 2019-02-10
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      相关资源
      最近更新 更多