C - Почему первые несколько элементов искажены, когда я читаю матрицу из файла? - PullRequest
0 голосов
/ 16 октября 2018

Я довольно новичок в программировании на C и хочу прочитать матрицу из данного файла, в этом файле элементы разделены пробелом.Я попытался с помощью следующего кода, обратите внимание, что он компилируется быстро, но когда я проверяю содержимое в моей матрице, первые 2 элемента в каждой строке искажаются до -2145378576 22099:

typedef struct matrix {
  int nrow;
  int ncol;
  int** data;
} matrix;

matrix* mread(char* filename) {
  FILE* f = fopen(filename, "r");
  char line[256];

  matrix* result = malloc(sizeof(matrix));
  int** data = malloc(0);
  int ncol, nrow = 0;

  while (fgets(line, sizeof(line), f)) {
    char* token = strtok(line, " ");
    int* temp = malloc(sizeof(int));
    ncol = 0;
    while (token != NULL) {
      temp = realloc(temp, ++ncol * sizeof(int));
      temp[ncol - 1] = strtol(token, NULL, 10);
      token = strtok(NULL, " ");
    }

    data = realloc(data, ++nrow * sizeof(temp));
    data[nrow - 1] = temp;
    free(temp);
  }
  result->ncol = ncol;
  result->nrow = nrow;
  result->data = data;
  free(data);
  fclose(f);
  return result;
}

Теперь, когда я пыталсячтобы прочитать матрицу из проекта Euler # 11, я обнаружил, что первые 2 элемента в каждой строке искажены.Тем не менее, я не могу понять, где проблема (я знаю, что это где-то около realloc для data ...)

Заранее спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Ваша программа имеет неопределенное поведение, потому что вы освобождаете указатель после назначения его переменной структуры result data, а затем возвращаете result из функции mread() [предполагая, что вы должны обращаться кresult->data, возвращаемое mread()] :

    data[nrow - 1] = temp;
    free(temp);
....
....
result->data = data;
free(data);

Вы не должны free temp и data здесь.Они должны быть освобождены, когда вы закончите с указателем result, возвращаемым mread().Обязательно сначала освободите все nrow из data, а затем освободите data.

Кроме того, вам не нужно выделять malloc(0) для data.Вместо этого присвойте NULL data.Поведение realloc аналогично вызову malloc(new_size), когда на него передан указатель NULL.

...