2010-05-29 7 views
1

Je suis en train de convertir un tableau de nombres entiers en un caractère en itérant tout le tableau, puis j'ajoute la chaîne résultante à la méthode new_item de ncurses. Pour une raison que je fais quelque chose de mal la façon dont je reallocate mémoire, donc je reçois la première colonne comme:realloc - convertir int en char

-4 Choice 1     0 Choice 1 
4 Choice 2     1 Choice 1 
4 Choice 3 - Instead of - 2 Choice 1 
4 Choice 4     3 Choice 1 
4 Exit      4 Choice 1 

-

#include <stdio.h> 
#include <stdlib.h> 
#include <curses.h> 
#include <menu.h> 

#define ARRAY_SIZE(a) (sizeof(a)/sizeof(a[0])) 
#define CTRLD  4 

char *choices[] = { 
         "Choice 1", 
         "Choice 2", 
         "Choice 3", 
         "Choice 4", 
         "Exit", 
        }; 
int table[5]={0,1,2,3,4}; 
int main() 
{ ITEM **my_items; 
    int c;    
    MENU *my_menu; 
    int n_choices, i; 
    ITEM *cur_item; 

    initscr(); 
    cbreak(); 
    noecho(); 
    keypad(stdscr, TRUE); 

    n_choices = ARRAY_SIZE(choices); 
    my_items = (ITEM **)calloc(n_choices + 1, sizeof(ITEM *)); 

    char *convert = NULL; 
    for(i = 0; i < n_choices; ++i){ 
     convert = (char *) malloc (sizeof(char) * 4); 
     sprintf(convert, "%i", table[i]); 
     my_items[i] = new_item(convert, choices[i]); 
    } 
    my_items[n_choices] = (ITEM *)NULL; 

    my_menu = new_menu((ITEM **)my_items); 
    mvprintw(LINES - 2, 0, "F1 to Exit"); 
    post_menu(my_menu); 
    refresh(); 

    while((c = getch()) != KEY_F(1)) 
    { switch(c) 
     { case KEY_DOWN: 
       menu_driver(my_menu, REQ_DOWN_ITEM); 
       break; 
      case KEY_UP: 
       menu_driver(my_menu, REQ_UP_ITEM); 
       break; 
     } 
    } 

    char *n = NULL, *d = NULL; 

    unpost_menu(my_menu); 
    free_menu(my_menu); 
    for(i = 0; i < n_choices; ++i){ 
     n = (char *) item_name (my_items[i]); 
     free (n); 
     d = (char *) item_description (my_items[i]); 
     free (d); 
     free_item(my_items[i]); 
    } 

    free(my_items); 
    endwin(); 
} 

** Mise à jour: Ceci a été corrigé. Voir le code ci-dessus!

Répondre

1

Vous essayez de realloc le même bloc de mémoire avec la même taille encore et encore, pour lequel realloc retourne juste le même bloc de mémoire. Vous écrasez donc les valeurs précédentes de convert et stockez le même tableau de caractères dans tous les éléments.

Vous devez utiliser malloc à la place:

// right here 
char *convert = NULL; 
for(i = 0; i < n_choices; ++i){ 
    convert = (char *) malloc (sizeof(char) * 4); 
    sprintf(convert, "%i", table[i]); 
    my_items[i] = new_item(convert, choices[i]); 
} 
+0

En fait, je l'ai fait, (voir code ci-dessus), mais jette valgrind 16 octets dans 4 blocs sont définitivement perdus dans le dossier de perte 4 21 à 0x4023D6E: malloc (vg_replace_malloc .c: 207) – Mike

+0

@Mike: vous devez également nettoyer toute la mémoire que vous allouez. –

+0

@Jonathan Leffler: Est-ce qu'il me manque quelque chose que je dois nettoyer? Je libère convertir – Mike