当我偶然发现这个时,我试图在另一个函数中调试我的代码"很奇怪"行为。
#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
而烦恼。其他评论说该代码适用于不同的平台。但为什么它对我不起作用呢? :/
感谢。
答案 0 :(得分:3)
我已经明白了。
即使编译器没有任何优化标志,调试器信息也是错误的。
所以我用两个for
循环打印出值,并且它被正确初始化,即使调试器说不然(很奇怪)。
感谢您的评论
答案 1 :(得分:-1)
您的代码应将其初始化为零。实际上,您可以执行int matrix[MAX][MAX] = {};
,并将其初始化为0.但是,int matrix[MAX][MAX] =
只会将矩阵[0] [0]设置为1,其他所有设置为0。for (i = 0; i < MAX; i++)
for (j = 0; j < MAX; j++)
printf("matrix[%d][%d] = %d\n", i, j, matrix[i][j]);
;
我怀疑你在Code :: Blocks中观察到的是调试器(gdb?)并没有完全显示它在代码中的确切位置 - 或者是优化器的其他副作用。要测试该理论,请在初始化后立即添加以下循环:
```int i,j;
disass main
```
并查看它打印的内容是否与调试器的输出一致。
我猜测可能会发生的事情是,由于您没有使用矩阵,优化器可能已决定不对其进行初始化。要验证,请反汇编主(gdb中的[a b c d e f]
并查看矩阵是否实际被初始化。