【问题标题】:Need explanation for odd for loop/scope problem需要解释奇怪的循环/范围问题
【发布时间】:2011-11-08 05:49:46
【问题描述】:

在开始获取矩阵的缩减行梯形表的程序时,我将用于打印数组的代码转移到了它自己的函数中。一旦我这样做了,我就得到了一个段错误。但令我困惑的是,一个不相关的变量声明(在下面评论)解决了段错误。

    #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");
      }
}

这似乎是我所能理解的问题,因此我们将不胜感激。

【问题讨论】:

  • 您从文件中读取的 ROWS 和 COLS 的值是多少?
  • 它们是文件中的前两个数字。正如 Eugene 指出的那样,ROWS 和 COLS 的值实际上并没有改变,我没有注意到这一点,因为我忘记测试 3 3 以外的值。

标签: c function for-loop scope


【解决方案1】:

您正在超出数组范围。两个额外的变量位于堆栈上的数组之后,因此您开始破坏它们而不是其他东西,这就是“解决”段错误的原因(它没有解决,当然,错误仍然存​​在)。

该代码存在严重问题:

  • 变量i 未经初始化就使用了
  • array 大小始终为 3x3。读取 ROWSCOLS 的新值不会调整数组的大小。如果例如如果您已从文件中读取 ROWS=4 和 COLS=4,您将损坏分配给 array 的内存之外的内存。

【讨论】:

  • 我不敢相信我没有看到。代码现在可以运行了,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多