需要解释奇怪的for循环/作用域问题



在开始编写获取矩阵的行简化阶梯形的程序时,我将用于打印数组的代码转换为其自己的函数。当我这样做的时候,我得到了一个分段错误。然而,令我困惑的是,一个不相关的变量声明(下面注释)解决了段错误。

    #include <stdio.h>

int COLS = 3;
int ROWS = 3;
void PrintArray(int array[][COLS]);
int main (int argc, char**argv) {
   int i, ii = 0;
   FILE *file;
   file = fopen(argv[1], "r");
   int array[ROWS][COLS];
   fscanf(file, "%d %d", &ROWS, &COLS);
   while (!feof(file))
   {
      fscanf(file, "%d", &array[i][ii]);
      ii++;
      if (fgetc(file) == 'n') {
         i++;
         ii = 0;
      }
   }
   int j = 0, k = 0; //This solved the segfault.
   PrintArray(array);
   printf("n");
   fclose(file);
   return 0;
}
void PrintArray(int array[][COLS]) //The printing function
{
   int j, k;
   for (j = 0; j < ROWS; j++)
      {
         for (k = 0; k < COLS; k++)
         {
            printf("%d", array[j][k]);
         }
         printf("n");
      }
}

经过几个小时的调试,我最终发现这可能与for循环中变量的作用域有关。

游戏介绍:

int COLS = 3;
int ROWS = 3;
int a; //declared globally
//main
   for (a = 0; a < ROWS; a++) {
      printf("for loop");
   }

可以工作,但是一旦我在main中声明"a":

int COLS = 3;
int ROWS = 3;

//main
   int a; //declared in main
   for (a = 0; a < ROWS; a++) {
      printf("for loop");
   }

它不工作。

同样,如果我用数字替换全局变量,我仍然会得到段错误,直到我删除最初修复段错误的行!

void PrintArray(int array[][3]) //COLS
{
   int j = 0, k = 0;
   for (j = 0; j < 3; j++) //ROWS
      {
         for (k = 0; k < 3; k++) //COLS
         {
            printf("%d", array[j][k]);
         }
         printf("n");
      }
}

我对这个问题的理解到此为止了,希望您能帮助我。

您正在超出数组边界。这两个额外的变量位于堆栈上数组的后面,所以你开始破坏它们而不是其他东西,这就是为什么段错误被"解决"了(当然,它没有解决,错误仍然存在)。

这段代码有严重的问题:

  • 变量i在未初始化的情况下使用
  • array的大小总是3x3。读取ROWSCOLS的新值不会调整数组的大小。例如,如果您从文件中读取ROWS=4和COLS=4,您将破坏分配给array的内存之外的内存。

最新更新