C 函数中使用2D数组导致的分段错误(可能)

C 函数中使用2D数组导致的分段错误(可能),c,pointers,multidimensional-array,dynamic-memory-allocation,C,Pointers,Multidimensional Array,Dynamic Memory Allocation,Edit3:添加了示例 Edit2:所以,因为我对一般的编码是新的,而且由于当前的评论,我需要问,如果我把整个代码作为评论发布会更好吗?(大约90行) 所以,我一直在玩动态内存分配,我有一个2D板,巫婆填充“.”。然后我在一个函数中导入电路板,witch检查可用的单元(带“.”==可用的单元)。它可以编译,但当我运行它时 分段错误 这是董事会malloc的代码 **board = (char**) malloc(x_input*sizeof(char*)); for(i = 0; i <x

Edit3:添加了示例

Edit2:所以,因为我对一般的编码是新的,而且由于当前的评论,我需要问,如果我把整个代码作为评论发布会更好吗?(大约90行)

所以,我一直在玩动态内存分配,我有一个2D板,巫婆填充“.”。然后我在一个函数中导入电路板,witch检查可用的单元(带“.”==可用的单元)。它可以编译,但当我运行它时

分段错误

这是董事会malloc的代码

**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]='.';
    }
}
这是我唯一一次(到目前为止)调用这个函数 编辑:
x\u替换
y\u替换
通过随机函数分配随机值

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

const int MAX_X=40;
常数int MAX_Y=40;
常数int MIN_X=20;
const int MIN_Y=20;
int x_输入,y_输入;
内部主(空){
炭板;
inti,j,k,障碍,敌人,选择;
做{
printf(“输入电路板大小。(必须介于(%d,%d)和(%d,%d)之间”)\n:,最小值X,最小值Y,最大值X,最大值Y);
scanf(“%d%d”,&x\u输入,&y\u输入);
}而((x_输入=MAX_x)和&(y_输入=MAX_y));
*board=malloc(sizeof(char[x_输入][y_输入]);
断言(*board!=NULL);

对于(i=0;i由于Ludin和一些程序员Dude的链接,我从不同的角度处理了这个问题,因此结果如下:

#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;
}
#包括
#包括
#包括
无效arr_alloc(大小x,大小y,字符(**板)[x][y])
{
*board=malloc(sizeof(char[x][y]);
断言(*board!=NULL);
}
空阵列填充(大小x,大小y,字符板[x][y])
{

对于(size_t i=0;请允许我们的问题向我们展示a.您何时何地拥有第一个代码段?何时何地以及使用什么参数调用
checker
函数?作为一名新来者,请花一些时间阅读,阅读SO,阅读,以及。在不忘记代码的最小部分的同时,使其具有可复制性是非常重要的同样非常重要。第一个和最后一个代码段是如何关联的?它们是如何相互关联的?对于
x_replacement
y_replacement
,初始值是多少?提示:
**board=(char**)malloc(x_input*sizeof(char*))
就类型方程而言是
char=char**
。看到这有什么问题吗?这可能不是你唯一的问题,但这肯定是你应该首先解决的问题,因为
char
在你的机器上的范围可能高达127或255,而
char**
(或任何指针)最大范围为4294967295或更高。
**board=(char**).
无法在标准C编译器上干净地编译。因此,即使没有警告,malloc也是最小的问题。更新:有人能解释一下为什么
board=(char**).
不能工作,因为这是malloc int数组的方法(至少我是在大学里接受教育的)
  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;
  }     
#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;
}