矩阵不是零填充声明

时间:2015-11-10 22:09:32

标签: c gcc codeblocks c99 c89

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

#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编译器)进行编译:{{1​​}},-std=c89-std=c99但它& #39;是一样的。

任何关于错误的想法?你能解释一下吗?

编辑: 我特地询问std=c11初始化程序。

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

编辑2: 我特别为{{0}}及其捆绑的Code::Blocks而烦恼。其他评论说该代码适用于不同的平台。但为什么它对我不起作用呢? :/

感谢。

2 个答案:

答案 0 :(得分:3)

我已经明白了。

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

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

感谢您的评论

答案 1 :(得分:-1)

您的代码应将其初始化为零。实际上,您可以执行int matrix[MAX][MAX] = {};,并将其初始化为0.但是,int matrix[MAX][MAX] = for (i = 0; i < MAX; i++) for (j = 0; j < MAX; j++) printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]); ;只会将矩阵[0] [0]设置为1,其他所有设置为0。

我怀疑你在Code :: Blocks中观察到的是调试器(gdb?)并没有完全显示它在代码中的确切位置 - 或者是优化器的其他副作用。要测试该理论,请在初始化后立即添加以下循环:

```int i,j;

disass main

```

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

我猜测可能会发生的事情是,由于您没有使用矩阵,优化器可能已决定不对其进行初始化。要验证,请反汇编主(gdb中的[a b c d e f]并查看矩阵是否实际被初始化。