free () выдает мне ошибку недопустимого разговора из чата в void - PullRequest
0 голосов
/ 27 февраля 2019

Я изучаю материал о динамической памяти и пытаюсь написать некоторый код.Однако, если я пытаюсь запустить его, он выдает ошибку, и я не могу ее решить.Должно быть, что-то не так с использованием malloc (), но я не уверен.

Здесь указаны ошибки -> free (cube [c] [b] [a]);

Спасибо!

Вот мой код:

#include <stdio.h>
#include <stdlib.h>

#define DIM 4

void showCube(char**** cube, int dim) {
  int a, b, c;
  for(c = 0; c < dim; c++) {
    for(b = 0; b < dim; b++) {
      for(a = 0; a < dim; a++) {
        printf("%c ", *cube[c][b][a]); 
      }
      printf("\n");
    }
    printf("50*-\n");
  }
}

int main() {
  char*** cube = (char***)malloc(sizeof(char**) * DIM);
  int a, b, c;
  for(c = 0; c < DIM; c++) {
    cube[c] = (char**)malloc(sizeof(char**) * DIM);
    for(b = 0; b < DIM; b++) {
      cube[c][b] = (char*)malloc(sizeof(char*) * DIM);
      for(a = 0; a < DIM; a++) {
        cube[c][b][a] = ((a + b + c) % 26) + 'A'; 
      }
    }
  }

  showCube(&cube, DIM);

  for(c = 0; c < DIM; c++) {
    for(b = 0; b < DIM; b++) {
      for(a = 0; a < DIM; a++) {
        free(cube[c][b][a]); 
      }
      free(cube[c][b]);
    }
    free(cube[c]);
  }
  free(cube);
  return 0;
}

1 Ответ

0 голосов
/ 27 февраля 2019

Когда вы выделяете пространство для массива, вы выделяете память на трех уровнях:

  char*** cube = (char***)malloc(sizeof(char**) * DIM);
  int a, b, c;
  for(c = 0; c < DIM; c++) {
    cube[c] = (char**)malloc(sizeof(char**) * DIM);
    for(b = 0; b < DIM; b++) {
      cube[c][b] = (char*)malloc(sizeof(char*) * DIM);
      for(a = 0; a < DIM; a++) {
        cube[c][b][a] = ((a + b + c) % 26) + 'A'; 
      }
    }
  }

Но попробуйте освободить его на 4 уровнях:

  for(c = 0; c < DIM; c++) {
    for(b = 0; b < DIM; b++) {
      for(a = 0; a < DIM; a++) {
        free(cube[c][b][a]); 
      }
      free(cube[c][b]);
    }
    free(cube[c]);
  }
  free(cube);

cube[c][b][a] являетсяchar, а не char *, поэтому вы не можете его освободить.Избавьтесь от самой внутренней петли.

  for(c = 0; c < DIM; c++) {
    for(b = 0; b < DIM; b++) {
      free(cube[c][b]);
    }
    free(cube[c]);
  }
  free(cube);
...