Probleme de malloc sur un tableau de pointeur.

Probleme de malloc sur un tableau de pointeur. - C - Programmation

Marsh Posté le 23-01-2008 à 19:48:37    

Bonsoir a tous !!  
 
Alors, malgré des recherches poussées, je n'ai toujours pas compris comment faire un chose comme ce ci;
c'est un exemple pour me faire comprendre.
 
char *code[4];
int i;
 
        code[0]=(char*)malloc(6*sizeof(char));
        code[1]=(char*)malloc(6*sizeof(char));
        code[2]=(char*)malloc(6*sizeof(char));
        code[3]=(char*)malloc(6*sizeof(char));
 
     for(i=0;i<4;i++)
     {
          gets(code[i]);
   }
 
         for(i=0;i<4;i++)
     {
 
     puts(code[i]);
   }
 
 
Il s'agit donc d'un tableau de 4 pointeurs pointant vers des chaînes de 5 caractères  ( si j'ai compris jusque la ^^)
 
 
J'ai deux questions;  
1)    Je voudrais savoir comment allouer dynamiquement le nombre de pointeur dans ce tableau car il devra varier dans mon programme, genre;
 
char **code  
 
avec ensuite un malloc, mais alors je ne comprends pas comment, un INT, un CHAR ?, j'ai essayé plusieurs possibilités... rien n'y fait !  
 
2)  
       Est ce que ceci  
         
        code[0]=(char*)malloc(6*sizeof(char));
        code[1]=(char*)malloc(6*sizeof(char));
        code[2]=(char*)malloc(6*sizeof(char));
        code[3]=(char*)malloc(6*sizeof(char));
 
se suit dans la memoire de l'ordi, car je souhaiterai faire  
 
    code[0]=(char*)malloc(4*6*sizeof(char));
 
J'espere avoir ete clair...  
j'ai absolument besoin d'aide la dessus, je remercie deja celui qui saura faire la lumiere... car faut absolument que je comprenne pour un projet...  
 
Tchuss
 
 

Reply

Marsh Posté le 23-01-2008 à 19:48:37   

Reply

Marsh Posté le 23-01-2008 à 20:03:46    

1) Oui il te faut un char** code, puis tu alloues code pour N pointeurs, puis code[i] comme tu as fait.
2) Je ne sais pas si ça se suit dans la mémoire. Mais, si j'ai bien compris, tu veux savoir si tu peux redimentionner code[i] après coup? Si oui pas de problèmes. Mais il faudrait avoir plus de précisions.

Reply

Marsh Posté le 23-01-2008 à 20:05:19    

char** code = malloc( n*sizeof(char*));
et ensuite ton code d'allocation des code[i]

Reply

Marsh Posté le 23-01-2008 à 20:07:12    

Il n'y a aucune raison que les 4 zones allouées se suivent
 
edit: avec          
        code[0]=(char*)malloc(6*sizeof(char));
        code[1]=(char*)malloc(6*sizeof(char));
        code[2]=(char*)malloc(6*sizeof(char));
        code[3]=(char*)malloc(6*sizeof(char));


Message édité par bobleblob le 23-01-2008 à 20:07:56
Reply

Marsh Posté le 23-01-2008 à 20:09:33    

D'ailleurs le cast (char*) est inutile et même à ne pas utiliser ça pourrait juste servir à cacher une erreur.
 
Edit: et puis le gets est aussi à proscrire. fgets est pas mal.
 
Edit2: et aussi penser à vérifier les retours de malloc :D


Message édité par ngkreator le 23-01-2008 à 20:10:59
Reply

Marsh Posté le 23-01-2008 à 20:14:58    

Code :
  1. code[0]=(char*)malloc(6*sizeof(char));
  2.        code[1]=(char*)malloc(6*sizeof(char));
  3.        code[2]=(char*)malloc(6*sizeof(char));
  4.        code[3]=(char*)malloc(6*sizeof(char));
 
  • fais une boucle plutôt qu'une telle répétition de lignes de code
  • ça n'est pas très utile de faire une allocation dynamique de taille fixe ;)
  • inutile de caster le retour de malloc()


Code :
  1. gets(code[i]);
 

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAARRRRRRRRRRRRRRRRRRGLL ! [:florentg]

 

Ne jamais, jamais, JAMAIS utiliser la fonction gets().
Elle est dépréciée depuis, pfiou, plein d'années, et ce pour une excellente raison : il n'y a aucun contrôle de taille, donc tu n'as aucun moyen de vérifier qu'il n'y a pas de dépassement de capacité : stockage de données dans un espace trop petit => débordement mémoire => comportement indéfini (i.e. des fois ça marche, des fois ça semble marchouiller et ça fait n'importe quoi, ou alors ça plante dans d'atroces souffrances).

 
Code :
  1. Il s'agit donc d'un tableau de 4 pointeurs pointant vers des chaînes de 5 caractères  ( si j'ai compris jusque la ^^)
 

Yup.

 
Code :
  1. 1)    Je voudrais savoir comment allouer dynamiquement le nombre de pointeur dans ce tableau car il devra varier dans mon programme, genre;
  2.  
  3. char **code
  4.  
  5. avec ensuite un malloc, mais alors je ne comprends pas comment, un INT, un CHAR ?, j'ai essayé plusieurs possibilités... rien n'y fait !
 

Ça ne se code pas au hasard en effet.

 

Essaie de zieuter les informations sur cette page :
http://mapage.noos.fr/emdel/notes.htm#pointeurs

 
Code :
  1. 2)
  2.       Est ce que ceci
  3.        
  4.        code[0]=(char*)malloc(6*sizeof(char));
  5.        code[1]=(char*)malloc(6*sizeof(char));
  6.        code[2]=(char*)malloc(6*sizeof(char));
  7.        code[3]=(char*)malloc(6*sizeof(char));
  8.  
  9. se suit dans la memoire de l'ordi, car je souhaiterai faire
  10.  
  11.    code[0]=(char*)malloc(4*6*sizeof(char));
 

Je ne comprends pas bien ce que tu souhaites faire.
Si c'est allouer n chaînes de taille fixe dans un seul et unique buffer, il te suffit de définir un char* dont la taille vaut n fois la taille d'une chaîne. Mais il va te falloir gérer ça correctement ce qui, puisque tu débutes, me semble prématuré pour le moment, surtout que je ne vois pas bien le gain que cela peut t'apporter ici.

 

Alloue donc un char** correctement pour commencer. [:dawa]


Message édité par Elmoricq le 23-01-2008 à 20:16:11
Reply

Marsh Posté le 23-01-2008 à 20:23:04    

GENIAL ce forum !!  Des énormes merci !
 
je mets en application tout ça, et je vous montre la fonction que je dois réaliser en fait...  
 
a dans quelques dizaines de minutes ^^

Reply

Marsh Posté le 23-01-2008 à 21:29:48    

Alors, si j'ai compris et bien lu ce que vous m'avez dis;  
 
void generateur(int version, int taille,int nbpartie, char **code)  
{  
int i;  
 
**code=malloc((nbpartie)*sizeof(char));  
 
if(**code==NULL)  
{  
printf("Impossible d'allouer la memoire !!!" );  
}  
 
for(i=0;i++;i<(nbpartie))  
{  
*(code+i)=malloc((taille+1)*sizeof(char));  
 
if(*(code+i)==NULL)  
{  
printf("Impossible d'allouer la mÈmoire !!!" );  
}  
(*(code+i))[taille+1]='\o'  
}  
}  
 
La, theoriquement, je dois avoir tout ce qu'il faut pour commencer a le remplir.
Sachant que c'est un fonction qui doit générer "NBPARTIE" codes de "TAILLE" caracteres. ( 1 à 8 caractères possibles)
 
Ensuite, une fois que j'aurais ce satané tableau: je le remplirai en fonction de la version ( 1 ou 2) ,  qui determinera si tout les caracteres seront differents ou si c'est sans importance.
 
En fait, c'est le debut d'un master mind... le gros reste a faire ^^
 
Merci.
 
ps: comment je mets mes parties de code dans un cadre du forum comme vous ?

Reply

Marsh Posté le 23-01-2008 à 22:40:22    

pour mettre dans un cadre le code en couleur met le entre les balises [\code=cpp] et [/\code] (sans \)

Code :
  1. void generateur(int version, int taille, int nbpartie, char **code)  
  2. {  
  3.    int i;  
  4.    // pas **code, là tu alloue pour code qui est de type char**,
  5.    code = malloc(nbpartie * sizeof(char*)); // ici c'est bien sizeof(char *)
  6.  
  7.    if (code == NULL)  
  8.    {  
  9.        printf("Impossible d'allouer la mémoire pour code !!!\n" );  
  10.    }  
  11.  
  12.    for (i = 0; i < nbpartie; i++)  // là c'est i++ en dernier, pas en deuxième
  13.    {  
  14.        // *(code + i) ou code[i]
  15.        code[i] = malloc((taille + 1) * sizeof(char));  
  16.  
  17.        if (code[i] == NULL)  
  18.        {  
  19.            printf("Impossible d'allouer la mémoire pour code[%d] !!!\n", i);  
  20.        }  
  21.        code[i][taille + 1] = '\0'  
  22.    }  
  23. }


 
Une fois que t'as alloué ton tableau de char* donc un char** et chacune des cases de ce tableau, tu peux écrire ce que tu veux dedans


---------------
Always wear a camera!
Reply

Marsh Posté le 23-01-2008 à 23:00:39    

Encore une fois, merci beaucoup ça m'a été de grande utilité, je vais pouvoir continuer le reste...  super!  
 

Reply

Marsh Posté le 23-01-2008 à 23:00:39   

Reply

Marsh Posté le 24-01-2008 à 16:50:25    

jeunestomac a écrit :

Encore une fois, merci beaucoup ça m'a été de grande utilité, je vais pouvoir continuer le reste...  super!  
 


Et apprends à utiliser les balises de code. C'est expliqué dans les règles du forum...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 24-01-2008 à 17:29:31    

D'ailleurs je viens de découvrir que on peut utiliser des balises [ code = nom_du_langage]  [ / code]  à la place [ code ] [ / code ] tout court. C'est pas marqué ça dans les régles. Le fait qu'on puisse faire disparaître les numéros de lignes par double clic est également à découvrir tout seul :o

Reply

Marsh Posté le 24-01-2008 à 23:13:50    

ngkreator a écrit :

D'ailleurs je viens de découvrir que on peut utiliser des balises [ code = nom_du_langage]  [ / code]  à la place [ code ] [ / code ] tout court. C'est pas marqué ça dans les régles. Le fait qu'on puisse faire disparaître les numéros de lignes par double clic est également à découvrir tout seul :o


Wahou! et moi qui m'emmerde toujours à les virer à la main merci ;)


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 25-01-2008 à 06:45:28    

ptitchep a écrit :


Wahou! et moi qui m'emmerde toujours à les virer à la main merci ;)


Euh, la technique ancestrale consistait à 'répondre' et à copier/coller à partir de la réponse...
 
Mais le coup du double-click, oui, je l'avais oublié. C'est vrai que c'est pratique...
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed