【问题标题】:Printing matrix values打印矩阵值
【发布时间】:2018-08-23 18:04:27
【问题描述】:

我不了解我的程序。代码如下:

  #include <stdio.h>

    int main(){

    int t[2][5], i, j;

    t[1][0]=2;
    t[1][1]=3;
    t[1][2]=4;
    t[1][3]=5;
    t[1][4]=6;

    t[0][2]=7;
    t[1][2]=8;

    for(i=0; i<2; i++){
        for(j=0; j<5; j++){
            printf("%d ", t[i][j]);
        }
        printf("\n");
    }

    for(i=0; i<2; i++){
        t[0][i]=0;
    }

    for(i=0; i<2; i++){
        for(j=0; j<5; j++){
            printf("%d ", t[i][j]);
        }
        printf("\n");
    }


return 0;
}

它给了我这个输出:

0 0 7 0 4196128 
2 3 8 5 6 
0 0 7 0 4196128 
2 3 8 5 6 

我不明白为什么会弹出 4196128。请解释一下。

我想这与编译器有关。

【问题讨论】:

  • @SusmitAgrawal 为什么 t[0][0] = 0?我也没有初​​始化 t[0][0]。
  • 你做到了。 for(i=0; i&lt;2; i++){t[0][i]=0;} 会这样做。
  • @TimRandall 在那之后我做到了。
  • 好吧,如果您不清楚您是在谈论第一个打印输出还是第二个打印输出,那么我们的沟通将会模棱两可并且容易产生误解。我理解“我没有初始化 t[0][0]”的意思是您认为您从未 分配了一个值。这就是为什么我指出你这样做了。
  • 记住这一点:它从来不是编译器。

标签: c arrays initialization


【解决方案1】:

不,这与未初始化的值及其用法有关。

对于数组t[0],您从未初始化除t[0][2] 之外的任何元素。因此,其他元素的值仍然是“不确定的”。

现在,元素

  • 具有可以具有陷阱表示的类型
  • 他们的地址永远不会被占用

因此,尝试使用任何具有不确定值的元素的值将是undefined behaviour。

【讨论】:

  • 实际上 t[0][0] 和 t[0][1] 在第二次打印输出之前被设置为零。数组索引使用了“错误”的变量,这使得它很难被发现。
  • @TimRandall,是的,但是一旦你的程序调用了 UB,就没有任何保证。
  • 我不认为打印整数值像你暗示的那样危险。
  • @TimRandall 使用任何类型的单元化值都是严重错误的来源,即使不危险。我假设整数比其他任何东西都更糟糕,因为它们可能不太容易被发现(想象一下垃圾值 5 而不是预期的 100,考虑到内存布局和使用情况,这并不难发生)。
【解决方案2】:

访问t[0][4] 处的值时会打印值4196128。 t 中的那个位置没有设置,所以你读取了一个没有初始化的值,它将是之前内存中的任何值,或者编译器想要的任何值。

【讨论】:

    【解决方案3】:

    您从未为数组中的多个元素赋值。当你把它们打印出来时,你就可以预先看到内存中的内容。 具体来说: 在第一次打印输出时,t[0][0] t[0][1] t[0][3] t[0][4] 未初始化。 在第二次打印输出时,t[0][3] t[0][4] 未初始化。

    【讨论】:

      【解决方案4】:

      如果您使用{0} 解决您的问题。

      int t[2][5]={0}
      

      所有未修改的数字都将打印 '0'

      OUTPUT:

      0 0 7 0 0
      2 3 8 5 6
      0 0 7 0 0
      2 3 8 5 6
      

      当我们初始化一个变量时,它会有一个随机数。 例如:int x

      如果您打印x,您将看到一个随机数,例如 5346

      所以你不需要这段代码:

      for(i=0; i<2; i++){
              t[0][i]=0;
          }
      

      只需输入{0}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-29
        • 2018-03-29
        • 1970-01-01
        相关资源
        最近更新 更多