无法在结构的2d数组中分配内存

时间:2014-04-10 21:25:57

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

我正在尝试用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。 谢谢,提前回答任何问题,并抱歉我的英语不好。任何帮助都是相关的。

1 个答案:

答案 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_xsizeof(int*)更多内存),第一种解决方案更易于读/写(因此不易出错,并且更容易维护。


关于您的代码,您的问题是“{1}}在”检查“之后就是myboard->a(实际上是分配 - 请注意,”错误“永远不会显示,因为myboard-&gt;然后为NULL,其值为'false'。):

NULL

应该是:

if (myboard->a = NULL)

此外,正如@WhozCraig在对您的帖子发表的评论中指出的那样,您可能希望在if (myboard->a == NULL) 循环的条件下使用i,而不是for;而且您可能还希望在malloc中分别使用jint类型而不是int*char类型,因为char*成员a结构是board。哦,还要考虑在int**字符串之后添加换行符,或者使用printf(3)