C 函数中使用2D数组导致的分段错误(可能)
Edit3:添加了示例 Edit2:所以,因为我对一般的编码是新的,而且由于当前的评论,我需要问,如果我把整个代码作为评论发布会更好吗?(大约90行) 所以,我一直在玩动态内存分配,我有一个2D板,巫婆填充“.”。然后我在一个函数中导入电路板,witch检查可用的单元(带“.”==可用的单元)。它可以编译,但当我运行它时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
分段错误
这是董事会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;
}