Char** conditional jump or move depends on uninitialised value

Résolu
Xtazy78 -  
 Xtazy78 -
Bonsoir,

Je vous explique mon probleme :

J'ai une fonction qui utilise un char **alphabet cependant valgrind me met une erreur de contexte comme quoi alphabet n'est pas initialise.
char **alphabet = malloc(sizeof (char) * 100); 
int i = 26; 
int nb = 0; 

while (i >= 0) 
{ 
    alphabet[nb][0] = 'a' + nb; 
    nb++; 
    i--; 
} 


PS : Je veux utiliser un char ** et non pas un char *

9 réponses

  1. Utilisateur anonyme
     
    Bonjour

    char **alphabet = malloc(sizeof (char) * 100); 

    C'est très mal parti...
    Tu te bases sur la taille d'un simple char pour initialiser alphabet, alors qu'alphabet va pointer sur des pointeurs ...
    Ce sont alphabet[0], alphabet[1].. qui vont pointer sur des caractères

    Quand tu utilises un char **, ta variable ne pointe pas sur un tableau à 2 dimensions.
    Elle pointe sur un tableau de pointeurs qu'il faut allouer et initialiser
    Ensuite, chacun de ces pointeurs est un char * classique (qu'il faut aussi allouer et initialiser)

    pour initialiser (pas testé) :
    #define NBCHAINES 26  
    #define NBCARACTERES 10  
    char **alphabet = malloc(sizeof (char *) * NBCHAINES);   
    int k;  
    for (k=0; k<NBCHAINES; k++) {  
      alphabet[k]=malloc(sizeof(char) * NBCARACTERES);  
      alphabet[k][0]='a'+k;  
    }  
    
    1
    1. Xtazy78
       
      Merci :)
      0
  2. Xtazy78
     
    Je t'ai pas mis les includes

    void free_alphabet(char **alph)
    {
       int i = 0;
       while (alph[i] != NULL)
       {
           free(alph[i]);
           i++;
       }
       free(alph);
    }
    


    int main (void)
    {
    char **alphabet = malloc(sizeof (char) * 100); 
    int i = 26; 
    int nb = 0; 
    
    while (i >= 0) 
    { 
        alphabet[nb][0] = 'a' + nb; 
        nb++; 
        i--; 
    } 
    
    free_alphabet(alphabet);
    
    return (0);
    }
    
    0
  3. my89rc
     
    Le code est pas trop complet......

    Utilise du char* plutot que du char** !!
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Xtazy78
     
    Mec mon but etait d'utiliser un char**...

    Il suffit juste d'utiliser calloc mon pote !

    man calloc si tu veux, mais en gros c'est un malloc plus des allocations sur chaque case memoire reservee.

    Bisous
    0
  6. my89rc
     
    man netiquette deja

    et je code calloc chaque matin, merci
    0