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. 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
    1. Le code est pas trop complet......

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