矩阵未在声明中填零

Matrix not zero-filled on declaration

当我偶然发现这种 "weird" 行为时,我正试图在另一个函数中调试我的代码。

#include <stdio.h>

#define MAX 20

int main(void) {
    int matrix[MAX][MAX] = {{0}};

    return 0;
}

如果我在 return 0; 行上设置一个断点,并且我用 Code::Blocks 查看局部变量,矩阵不会完全用零填充。 第一行是,但数组的其余部分只包含随机垃圾。

我知道我可以做一个双 for 循环来手动将所有内容初始化为零,但是 C 标准不应该用 {{0}} 将这个矩阵填充为零初始值设定项?

也许是因为这是漫长的一天,我累了,但我可以发誓我知道这一点。

我尝试使用不同的标准进行编译(使用 Code::Blocks 捆绑的 gcc 编译器):-std=c89-std=c99std=c11 但是是一样的

有什么问题吗?你能给我解释一下吗?

编辑: 我特别询问 {{0}} 初始值设定项。

我一直认为它会将所有列和所有行填充为零。

编辑 2: 我特别讨厌 Code::Blocks 及其捆绑的 GCC。其他评论说该代码适用于不同的平台。但为什么它对我不起作用? :/

谢谢。

我想通了。

即使编译器上没有任何优化标志,调试器信息也是错误的..

所以我用两个 for 循环打印出值并且它被正确初始化,即使调试器另有说明(奇怪)。

不过还是感谢评论

您的代码应将其初始化为零。事实上,你可以只做int matrix[MAX][MAX] = {};,它会被初始化为0。但是,int matrix[MAX][MAX] = {{1}};只会将matrix[0][0]设置为1,而其他所有内容都为0。

我怀疑您在 Code::Blocks 中观察到的是调试器 (gdb?) 没有完全向您显示它在代码中的中断位置 - 优化器的那个或其他一些副作用.要验证该理论,请在初始化后立即添加以下循环:

``` int i,j;

for (i = 0; i < MAX; i++)
  for (j = 0; j < MAX; j++)
     printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);

```

看看它打印的内容是否与调试器的输出一致。

我猜测可能发生的情况是,由于您没有使用矩阵,优化器可能决定不对其进行初始化。为了验证,在 gdb 中反汇编你的 main (disass main 并查看矩阵是否真的被初始化。