0

我想在C中開發TicTacToe遊戲,我使用了下列結構。myboard->一個成員用於存儲'X'或'O',這意味着移動一名球員與球隊的座標相同,在(1.1) 'X' 或 'O'(3.1)在一個結構的2D陣列中分配內存的麻煩

typedef struct{ 
    int** a;  
    int size; 
}_board; 
typedef _board* board; 
board myboard =(board) malloc(sizeof(board)); 
scanf_s("%d", &(myboard->size)); 

尺寸=是井字遊戲板的n×n的大小。

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

'for(i = 0; j size; i ++)'我建議在這個循環的條件下使用'i'。最終你會發現應該是'myboard-> a [i] = malloc(myboard-> size * sizeof(int))',因爲目前你爲每行分配了* 1 * char。也許這是意圖,但我有點懷疑它。 – WhozCraig

回答

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); 

但THI s實際上是非常複雜的,除非爲了學習的目的,否則我不會提出這樣的建議:在大多數情況下,分配的內存將是連續的,因此第二種解決方案將在內存中分配幾乎相同的結構,但效率會降低(「2D」陣列解決方案需要更多內存的b_size_xsizeof(int*)倍),並且第一種解決方案將更易於讀取/寫入(因此不易出錯並易於維護)。


關於你的代碼,你的問題是,myboard->aNULL之後的「檢查」(這實際上是一個分配 - 注意,「ERROR」永遠不會顯示,因爲myboard->然後NULL,這評價爲 '假'):

if (myboard->a = NULL) 

這應該是:

if (myboard->a == NULL) 

此外,在他的評論中指出的@WhozCraig您的文章,您migh您想在for循環的條件下使用i,而不是j;你也可能想在你的malloc(S)分別使用intint*類型,而不是charchar*類型,因爲board結構的a成員是int**。哦,還有,考慮在你的printf(3)字符串後面加上換行符,或者使用puts(3)