2016-04-16 9 views
-2

ねえ、私は、構造体の上にC:構造体要素、奇妙なBehivor無料()を使用した問題

typedef struct bingo 
    { 
    char board[5][5]; 
    int* luckNum; 
    int* boardNum; 
    } bingo; 

    void update(bingo *pBingo,int num); //Function that gets a struct, number and checks if he is in the board, if it does he change it to "X" 

    int main(void) 
    { 
    srand(time(NULL)); 
    int i, j, m, k, temp[75], *parr; 
    bingo player; 

    //For rellocating them later 
    if (!(player.luckNum = (int*) malloc(sizeof(int)))) 
    { 
     printf("ERROR"); 
    } 
    if (!(player.boardNum = (int*) malloc(sizeof(int)))) 
    { 
     printf("ERROR"); 
    } 
    //giving temp values of 1-75 
    for (i = 0; i < 75; i++) 
    { 
     temp[i] = i + 1; 
    } 



    //Giving the player board random values of 1-75 without repeating the same number twice 
     for (i = 0; i < 5; i++) //Passing on the rows 
     { 
      for (j = 0; j < 5; j++) //Passing on the collumns 
      { 

      // 
       do 
       { 
        k = rand() % 75; //from 0-74 
       } 
       while (temp[k] == NULL); //while temp[k] is marked 
       player.board[i][j] = temp[k]; 
       temp[k] = NULL; //NULL as a "flag" that marks the cell as taken (for not taking the same number twice) 
       player.luckNum=(int*) malloc(sizeof(int)*(i*j+j)); 
       player.luckNum[i*j + j] = player.board[i][j]; 
      } 
     } 

    //sets luckNum 
     for (i = 0; i < 25; i++) 
    { 
     printf("%d ", player.luckNum[i]); 
     update(&player, player.luckNum[i]); 
    } 


    printf("\n"); 
    for (i = 0; i < 25; i++) 
    { 
     printf("%d",player.luckNum); 
    } 

    free(player.boardNum); 
    free(player.luckNum); 





    getchar(); 
    return 0; 
} 

void update(bingo *pBingo, int num) 
{ 
    int i, j, k; 
    static int counter = 0,luckCounter = 25; 



    for (i = 0; i < 5; i++) 
    { 
     for (j = 0; j < 5; j++) 
     { 
      if (num == (int) (pBingo->board[i][j])) 
      { 
       pBingo->board[i][j] = 'X'; 
       counter++; 
       pBingo->boardNum = (int*) realloc(pBingo->boardNum, sizeof(int)*counter); 
       pBingo->boardNum[counter] = num; 

       for (k = 0; k < luckCounter; k++) 
       { 
        if (pBingo->luckNum[k] == num) 
        { 
         num = pBingo->luckNum[k]; 
         pBingo->luckNum[k] = pBingo->luckNum[luckCounter-1]; 
         pBingo->luckNum[luckCounter-1] = num; 
         pBingo->luckNum = (int*) realloc(pBingo->luckNum, sizeof(int)*luckCounter); 
         luckCounter--; 
        } 
       } 
      } 

     } 
    } 

} 

は誰がどのような割り込みを認識することができ、警告

ロングコードを要素を解放することで問題を抱えていますfree()関数はメモリを解放しますか?私はC言語を使い慣れていて、このコードを使って良い日を勉強していますので、free()関数についての私の知らないことには申し訳ありません。

+0

一つの問題をplayer.luckNum'メインの始めとネストされたループ(これは完全に間違っていると思われます)。 –

答えて

0

宜蘭、

は、必要に応じてあなたのコードをポストすることを恐れてはいけません。まず第一に、コンパイラの警告に気をつけていますか?

いくつかの問題領域:

while (temp[k] == NULL)

あなたは0、NULLと '\ 0' が、ポインタにNULLの使用を予約するとの違いを研究することができます。また:

for (i = 0; i < 25; i++) 
    { 
     printf("%d",player.luckNum); 
    } 

Printfは整数を想定しており、ポインタを与えています。最後に、私があなたの問題だと思っていることに対処するために、 ".. free()関数がメモリを解放するのを中断しますか?"あなたのプログラムは単に返されないということですか?もしそうなら、最終的なgetchar()を取り除く。あなたはまだこのプログラムで少なくとも1つのリークを持つつもりです。このmalloc関数のこのアドレス:あなたが最初に解放せずにここにluck.Numに新しいアドレスを割り当てられた

if (!(player.luckNum = (int*) malloc(sizeof(int)))) 

は失われます:あなたは `malloc関数を割り当てることである

player.luckNum=(int*) malloc(sizeof(int)*(i*j+j));