c - 在结构的二维数组中分配内存时出现问题

标签 c segmentation-fault structure multidimensional-array dynamic-memory-allocation

我正在尝试用 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_xsizeof(int*) 内存),并且第一个解决方案会更简单读/写(因此不太容易出现错误,并且更易于维护)。

<小时/>

关于您的代码,您的问题是 myboard->a 在“检查”之后为 NULL (这实际上是一个分配 - 请注意“ERROR "永远不会显示,因为 myboard-> 为 NULL,其计算结果为“false”。):

if (myboard->a = NULL)

应该是:

if (myboard->a == NULL)

此外,正如 @WhozCraig 在对您的帖子的评论中指出的那样,您可能希望在 for 循环的条件中使用 i,而不是 j;并且您可能还想在您的代码中分别使用 intint* 类型,而不是 charchar* 类型malloc(s),因为 board 结构的 a 成员是一个 int**。哦,还有,考虑在 printf(3) 字符串后面添加换行符,或者使用 puts(3)

关于c - 在结构的二维数组中分配内存时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22999331/

相关文章:

c - ARGV中的 vector 是指一维数组吗?

Android C++ 异常抛出导致 SIGSEGV

c++ - 二维 vector 给出分割错误

c++ - 多线程程序中的Segmentation Fault和gdb backtrace的信息不完整

c - 结构填充和包装

c - C 中振荡器的软件实现

c - 如何动态改变数据类型?

c - 在 ncurses 框中滚动内容

c - "struct user* "和 "struct user *"有什么区别?

c - 当我们在 C 中为链表定义结构时,为什么我们不会出错