我正在尝试用 C 语言开发 TicTacToe 游戏,我使用以下结构。 myboard->a 成员用于存储 'X' 或 'O' ,表示玩家在相同坐标中所做的移 Action 为董事会,即。 (1.1) 中的“X”或“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");
}
}
我在程序末尾使用 free 作为其 malloc。 提前感谢您的回答,并对我的英语不好表示歉意。感谢任何帮助。
最佳答案
我真的不明白为什么你要使用 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*)
内存),并且第一个解决方案会更简单读/写(因此不太容易出现错误,并且更易于维护)。
关于您的代码,您的问题是 myboard->a
在“检查”之后为 NULL
(这实际上是一个分配 - 请注意“ERROR "永远不会显示,因为 myboard-> 为 NULL,其计算结果为“false”。):
if (myboard->a = NULL)
应该是:
if (myboard->a == NULL)
此外,正如 @WhozCraig 在对您的帖子的评论中指出的那样,您可能希望在 for
循环的条件中使用 i
,而不是 j
;并且您可能还想在您的代码中分别使用 int
和 int*
类型,而不是 char
和 char*
类型malloc(s),因为 board
结构的 a
成员是一个 int**
。哦,还有,考虑在 printf(3)
字符串后面添加换行符,或者使用 puts(3)
。
关于c - 在结构的二维数组中分配内存时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999331/