【发布时间】:2015-11-10 22:09:31
【问题描述】:
当我偶然发现这种“奇怪”的行为时,我正试图在另一个函数中调试我的代码。
#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=c99、std=c11,但都是一样的。
有什么想法吗?能给我解释一下吗?
编辑:
我专门询问{{0}} 初始化程序。
我一直认为它会将所有列和所有行填充为零。
编辑 2:
我特别为Code::Blocks 及其捆绑的GCC 而烦恼。其他 cmets 表示该代码适用于不同的平台。但为什么它对我不起作用? :/
谢谢。
【问题讨论】:
-
嗯,这个答案说你做得对stackoverflow.com/a/1688758/1339987
-
使用二维数组是人们在学校喜欢做的事情,但在实践中,它带来的麻烦往往多于其价值。为什么不只使用一维数组,其中第一个 MAX 元素被假定为第一行,接下来的 MAX 元素是第二行,等等。由 matrix[row * NCOLS+col] 取消引用;在这种情况下,您可以更方便地将其初始化为简单的 matrix[NCOLS * NROWS]={0};
-
因为我想处理左上角的子矩阵,跳过外部部分会很头疼
-
如果您使用优化进行编译,您将无法相信调试器告诉您的内容。即使没有优化,我也不会 100% 相信它。打印出程序中的值以确保。
-
确保在有副作用的地方使用对象,以确保编译器实际上并未优化该对象。
标签: c gcc codeblocks c99 c89