在启动用于获取矩阵的“简化行梯形表格”的程序时,我将用于打印数组的代码转移到了自己的函数中。一旦这样做,我就会遇到段错误。不过,令我感到困惑的是,一个不相关的变量声明(如下所述)解决了段错误。

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


据我所知,这似乎可以解决您的问题,我们将不胜感激。

最佳答案

您将超出数组范围。这两个额外的变量紧随堆栈中的数组之后,因此您开始破坏它们而不是其他东西,这就是为什么“解决” segfault的原因(当然,它仍然没有解决)。

该代码存在严重问题:


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

关于c - 需要解释环路/范围问题的奇数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7268035/

10-11 22:48
查看更多