如何使我的外部for循环遍历i = 1?

时间:2018-06-07 11:15:49

标签: c

该代码旨在制作3个2D阵列(3x3)。 ar1由1组成,ar2的对角线分量等于2,否则为0。 ar3是ar1和ar2的每个对应索引的总和。我已经为此使用了嵌套for循环,但由于某种原因,外部for循环连续迭代i = 1。有谁知道如何解决这个问题?

#include <stdio.h>

#define SIZE 2 

int main(void)
  {
  int i = 0, j, ar1[2][2], ar2[2][2], ar3[2][2];

  for(i = 0; i<=SIZE; i++)
    {
    for(j = 0; j<=SIZE; j++)
      {
      ar1[i][j] = 1;

      if(i == j)
        ar2[i][j] = 2;
      else
        ar2[i][j] = 0;

      ar3[i][j] = ar1[i][j] + ar2[i][j];

      printf("%-4d", ar3[i][j]);
      }

    printf("\n");
    }

  return 0;
  }

2 个答案:

答案 0 :(得分:3)

此代码在i == SIZE

时访问数组越界
 int i = 0, j, ar1[2][2], ar2[2][2], ar3[2][2];

   for(i = 0; i<=SIZE; i++)
   {
     for(j = 0; j<=SIZE; j++)
     {
        ar1[i][j] = 1;

未定义的行为

在您的情况下,根据您所描述的内容,通过在ar内存外写字,您将覆盖ij,其值为1,会重置索引到1(数组可能位于编译器索引变量之前的)。那就解释了。

所以修复是

 int i = 0, j, ar1[SIZE][SIZE], ar2[SIZE][SIZE], ar3[SIZE][SIZE];

   for(i = 0; i<SIZE; i++)
   {
     for(j = 0; j<SIZE; j++)
     {
        ar1[i][j] = 1;

依此类推......(请注意,如果您将SIZE定义为2,最好还使用它来初始化数组)

BTW如果你想制作3x3阵列,你必须将SIZE设置为3

#define SIZE 3

所以第一个有效索引是0,最后一个有效索引是2

答案 1 :(得分:3)

在任何编程语言中,基本上有两种方法可以在1到N循环中编写&#34; for i&#34;:

for(i = 1; i <= N; i++)    /* "one-based" */

for(i = 0; i < N; i++)     /* "zero-based" */

尽早了解并充分了解这一点:在C中,基于0的循环非常受欢迎。这与C使用基于0的数组的事实密切相关。您偶尔会看到一个基于1的循环,但这种情况很少见,只会在您执行特殊操作时才会出现。但初始化一些普通数组并不特别。

每当您看到一个与上述两种模式之一不匹配的循环时,例如

for(i = 1; i < N; i++)      /* questionable */

for(i = 0; i <= N; i++)     /* questionable */

这应该是一个迹象,表明一些更不寻常的东西 - 可能是错误的 - 正在发生。循环for(i = 1; i < N; i++)总共进行了N-1次旅行。循环for(i = 0; i <= N; i++)总共进行N + 1次旅行。

如果要迭代大小为SIZE的数组,则总是要使用

for(i = 0; i < SIZE; i++)

形式,因为数组的索引从0到SIZE-1。

通过允许循环运行到i=SIZE,您可以访问阵列外部的内存。具体来说:由于SIZE为2,因此有效索引仅为0和1.当您将ij设置为2时,您将访问阵列外部的内存。

在这种情况下,通过访问阵列外部的内存,您可能无意中覆盖了i和/或j变量。 (具体来说,您可能将ij设置为0或1,这意味着它永远不会达到SIZE。)这可能是循环永远运行的原因。