【问题标题】:Matrix not zero-filled on declaration声明时矩阵未填零
【发布时间】: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=c99std=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


【解决方案1】:

我想通了。

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

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

感谢 cmets

【讨论】:

    【解决方案2】:

    您的代码应将其初始化为零。其实你可以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 并查看矩阵是否实际正在初始化。

    【讨论】:

    • int matrix[MAX][MAX] = {}; 在标准 C 中是不允许的
    • 我已经找到了答案。您不能只将{} 放入其中不带零,双括号更好{{0}}。数组也被正确初始化,我发现调试器只是显示单元格错误,或者编译器在后台进行了一些优化(没有我设置任何优化标志)
    • 另外我在后面的代码中使用了矩阵,我只是没有显示程序的其余部分,因为它无关紧要,因为我在声明和初始化之后暂停了调试器
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    相关资源
    最近更新 更多