我正在尝试用C语言开发TicTacToe游戏,我正在使用以下结构.myboard->成员用于存储' X'或者' O' ,意思是玩家在与棋盘相同的坐标中所做的移动,即。 ' X'在(1.1)或' O' (3.1)
typedef struct{
int** a;
int size;
}_board;
typedef _board* board;
board myboard =(board) malloc(sizeof(board));
scanf_s("%d", &(myboard->size));
Size =是TicTacToe板的大小nxn。
myboard->a =(int**)malloc(myboard->size*sizeof(char *));
if (myboard->a = NULL)
{
printf("ERROR!!!");
}
直到这一点,一切似乎都有效,但是当你看到如下所示尝试分配内存时,会出现分段错误。
int i;
for (i = 0; j<myboard->size; i++)
{
myboard->a[i] = malloc(sizeof(char));
if (myboard->a[i] == NULL)
{
printf("ERROR");
}
}
我在程序结束时使用免费的malloc。 谢谢,提前回答任何问题,并抱歉我的英语不好。任何帮助都是相关的。
答案 0 :(得分:0)
我真的不明白为什么你使用int**
变量存储你的电路板数据,当你可以使用一个简单的int*
时,你可以稍后用malloc(3)
分配如:
int* b_data;
int b_size = 9;
b_data = malloc(b_size * sizeof(int));
// ... Your code
free(b_data);
但是,如果确实想要使用int**
变量,您可以执行以下操作:
int** b_data;
int b_size_x = 3;
int b_size_y = 3;
int i;
b_data = malloc(b_size_x * sizeof(int*));
for(i = 0; i < b_size_x; i++)
*(b_data + i) = malloc(b_size_y * sizeof(int));
// ... Your code where you access your array of size_x containing
// arrays of size_y of int typed "cells"
for(i = 0; i < b_size_x; i++)
free(*(b_data + i));
free(b_data);
但这实际上是不必要的复杂,除非出于学习目的,否则我会不这样做:在大多数情况下,分配的内存将是连续的,因此第二个解决方案将分配近似内存中的结构相同,但效率较低(“2D”数组解决方案需要b_size_x
次sizeof(int*)
更多内存),第一种解决方案更易于读/写(因此不易出错,并且更容易维护。
关于您的代码,您的问题是“{1}}在”检查“之后就是myboard->a
(实际上是分配 - 请注意,”错误“永远不会显示,因为myboard-&gt;然后为NULL,其值为'false'。):
NULL
应该是:
if (myboard->a = NULL)
此外,正如@WhozCraig在对您的帖子发表的评论中指出的那样,您可能希望在if (myboard->a == NULL)
循环的条件下使用i
,而不是for
;而且您可能还希望在malloc中分别使用j
和int
类型而不是int*
和char
类型,因为char*
成员a
结构是board
。哦,还要考虑在int**
字符串之后添加换行符,或者使用printf(3)
。