2016-04-16 11 views
-2

Hey ich Probleme habe, indem sie die Elemente auf meinem struct befreienC: Probleme bei Verwendung von Free() auf Structs Elemente, Seltsam Behivor

Langcode

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

     } 
    } 

} 

jemand erkennen Warnung kann, was Interrupts die free() -Funktion aus dem Speicher zu befreien ?. Ich bin neu in C und arbeite an diesem Code über gute Tage so leid für meine Unwissenheit über die kostenlose() Funktion, kann mir jemand helfen?

+0

Ein Problem ist, dass man mit malloc zuteilen 'player.luckNum' am Anfang von main und dann in der verschachtelten Schleife (was völlig falsch scheint BTW). –

Antwort

0

Ilan,

Haben Sie keine Angst, Ihren Code zu schreiben mit der notwendigen umfasst. Vor allem, beachten Sie die Warnungen Ihres Compilers?

Einige Problembereiche:

while (temp[k] == NULL)

Sie können den Unterschied zwischen 0, NULL Forschung und '\ 0', aber die Verwendung von NULL für Zeiger reservieren. Außerdem:

Printf erwartet eine ganze Zahl und Sie geben es einen Zeiger. Schließlich, um zu adressieren, was ich denke, ist dein Problem, wenn du schreibst ".. unterbricht die freie() Funktion vom Freigeben des Gedächtnisses?" Meinst du dein Programm einfach nicht zurück? Wenn ja, dann loswerden der endgültigen getchar(). Sie werden immer noch mindestens ein Leck in diesem Programm haben. Die Adresse dieses malloc:

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

gehen verloren, wie Sie luck.Num eine neue Adresse hier zugewiesen, ohne das erste zu befreien:

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