矩阵未在声明中填零
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=c99
、std=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
并查看矩阵是否真的被初始化。
当我偶然发现这种 "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=c99
、std=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
并查看矩阵是否真的被初始化。