Ошибка сегментации из-за использования 2D-массива в функции (вероятно) - PullRequest
0 голосов
/ 21 апреля 2020

Edit3: добавлен пример.

Edit2: Итак, поскольку я новичок в кодировании в целом и из-за текущих комментариев, я должен спросить, было бы лучше, если бы я разместил весь код как комментарий? (около 90 строк)

Итак, я поиграл с динамическим распределением памяти c и у меня есть двухмерная доска, которая заполняется символом '.'. Затем я импортирую доску в функцию, которая проверяет наличие доступных ячеек (ячейка с «.» == в наличии). Он компилируется нормально, но когда я запускаю его, я получаю

segmentation fault

Вот код для платы mallo c

**board = (char**) malloc(x_input*sizeof(char*));
for(i = 0; i <x_input; i++){
    board[i] = (char*) malloc(y_input*sizeof(char));
}

for (i = 0; i<x_input; i++){
    for(j = 0; j<y_input; j++){
        board[i][j]='.';
    }
}

Вот функция

int checker(int x_axis, int y_axis, char **board){         
    if (board[x_axis][y_axis] == '.'){
        return 1;
    } else { 
        return 2; 
    }
}

И вот единственный раз (пока), когда я вызываю функцию Edit: x_replacement и y_replacement назначаются случайные значения с помощью функции rand

do{
    board[x_replacement][y_replacement] = '$';  
} while(checker(x_replacement, y_replacement, board) == 2);

EX:

  const int MAX_X = 40;
  const int MAX_Y = 40;
  const int MIN_X = 20;
  const int MIN_Y = 20;
  int x_input, y_input;

  int main(void){
    char **board;
    int i, j, k, obstacles, enemies, choice;

    do{
        printf("Enter board size. (Must be between (%d, %d) and (%d, %d))\n:", MIN_X, MIN_Y, MAX_X, MAX_Y);
        scanf("%d%d", &x_input, &y_input);
    }while ((x_input <= MIN_X && x_input >= MAX_X) && (y_input <= MIN_Y && y_input >= MAX_Y));

   *board = malloc(sizeof(char[x_input][y_input]));
    assert(*board != NULL);

    for (i = 0; i<x_input; i++){
        for(j = 0; j<y_input; j++){
            board[i][j]='.';
        }
    }
    return 0;
  }     

1 Ответ

0 голосов
/ 22 апреля 2020

Я подошел к этому с другой точки зрения, благодаря ссылкам Людина и некоторых программистов Чувак, поэтому результат работы следующий:

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

void arr_alloc (size_t x, size_t y, char(**board)[x][y])
{
  *board= malloc( sizeof(char[x][y]) ); 
  assert(*board!= NULL);
}

void arr_fill (size_t x, size_t y, char board[x][y])
{
  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      array[i][j] = '.';
    }
  }
}

void arr_print (size_t x, size_t y, char board[x][y])
{
  for(size_t i=0; i<x; i++)
  {
    for(size_t j=0; j<y; j++)
    {
      printf("%c ", board[i][j]);
    }
    printf("\n");
  }
}

int main (void)
{
    int x,y;
    char (*board)[x][y];
    printf("enter dimentions: \n");
    scanf("%d%d", &x, &y);



  arr_alloc(x, y, &board);
  arr_fill(x, y, *board);
  arr_print(x, y, *board);
  free(board); 

  return 0;
}
...