C:将数组值初始化为零的问题

时间:2011-09-15 13:40:29

标签: c arrays

我正在尝试构建以下14 * 14阵列i C:[I 0; 0 -I],即左上角的7 * 7单位矩阵,减去右下角的标识,否则为零。

这是方法:

#define DIM 7

 double S[2*DIM][2*DIM];

 for(i = 0; i < DIM; i++){
     for(j = 0; j < DIM; j++){
         if(i == j){
             S[i][j] = 1.0;
             S[i+7][j+7] = -1.0;
         }
         else{
             S[i][j] = 0.0;
         }
     } 
 } 

这适用于所有对角元素;但是,数组的某些元素被初始化为疯狂的值;例如,13,6被初始化为

68111186113812079535019899599437200576833320031036694798491976301968333351950125611739840800974137748034248687763243996679617222196278187875968953700681881752083957666277350377710107236511681624408064.000000

这似乎一直(至少三次)发生在条目11,1312,912,1013,1213,6上。

有人可以告诉我这里有什么用,或提供替代解决方案吗?

干杯!

编辑:奇怪的条目不一致。

EDIT2:错字:13,12,而不是13,15

6 个答案:

答案 0 :(得分:4)

您的循环仅覆盖左上象限,因此其他象限中的非对角线元素未初始化并包含垃圾。对于每个维度,你的循环应该上升到2*DIM,这样对角线元素就会归零,然后对角元素的条件应该稍微复杂一些,以决定将对角线元素设置为哪个值

注意[13,15]完全在这个数组之外!

答案 1 :(得分:4)

您可以用零初始化整个数组,然后只设置对角线

double S[2*DIM][2*DIM] = {0};
for (i = 0; i < DIM; i++) {
    s[i][i] = 1;
    s[i + DIM][i + DIM] = -1;
}

答案 2 :(得分:2)

您永远不会为s[i][j]i != ji >= DIM写信j >= DIM。如果您的阵列具有自动存储(“本地”),则它包含任意初始值。

答案 3 :(得分:1)

我想说除非i == j(对角线元素),否则大多数7x7以外的元素都不会被初始化。

您想将它们初始化为什么?

答案 4 :(得分:1)

那是因为你没有初始化这些元素。这是一些更好的代码:

#define DIM 14

double S[DIM][DIM];

for (i = 0; i < DIM; i++) {
    for (j = 0; j < DIM; j++) {
        if (i == j) {
            if (i < 7) {
                S[i][j] = 1.0;
            } else {
                S[i][j] = -1.0;
            }
        } else {
            S[i][j] = 0.0;
        }
    } 
}

答案 5 :(得分:0)

您永远不会在DIM + 1和2 * DIM之间使用i或j初始化值。因此,当您查看存储在其中一个位置的值时,您会看到在矩阵访问该空间之前存在的任何内容。