Char** conditional jump or move depends on uninitialised value

Résolu
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. 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;  
    }  
    
  2. 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);
    }
    
    1. Le code est pas trop complet......

      Utilise du char* plutot que du char** !!
      1. 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