Нужно объяснение нечетной проблемы петли / области - PullRequest
0 голосов
/ 01 сентября 2011

Запуская программу для получения матрицы с уменьшенным числом строк, я передал свой код для печати массива в его собственную функцию. Как только я это сделал, у меня появилась ошибка. Что меня озадачило, так это то, что несвязанное объявление переменной (см. Ниже) решило проблему с сегфоутом.

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

работает, но как только я объявляю "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");
      }
}

Кажется, это насколько я могу понять проблему, поэтому мы будем благодарны за вашу помощь.

1 Ответ

1 голос
/ 01 сентября 2011

Вы выходите за границы массива.Две дополнительные переменные лежат сразу после массива в стеке, поэтому вы начинаете их разрушать, а не что-то другое, поэтому segfault «решается» (он не решен, конечно, ошибка все еще существует).

Существуют серьезные проблемы с этим кодом:

  • Переменная i используется без инициализации
  • Размер array всегда равен 3x3.Чтение новых значений для ROWS и COLS НЕ изменяет размер массива.Если, например, вы прочитали ROWS = 4 и COLS = 4 из файла, вы повредите память вне той, которая выделена для array.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...