Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1250 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Probleme de malloc sur un tableau de pointeur.

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Probleme de malloc sur un tableau de pointeur.

n°1675911
jeunestoma​c
Posté le 23-01-2008 à 19:48:37  profilanswer
 

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
 
 

mood
Publicité
Posté le 23-01-2008 à 19:48:37  profilanswer
 

n°1675915
ngkreator
Posté le 23-01-2008 à 20:03:46  profilanswer
 

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.

n°1675917
Joel F
Real men use unique_ptr
Posté le 23-01-2008 à 20:05:19  profilanswer
 

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

n°1675918
bobleblob
Posté le 23-01-2008 à 20:07:12  profilanswer
 

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
n°1675919
ngkreator
Posté le 23-01-2008 à 20:09:33  profilanswer
 

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
n°1675920
Elmoricq
Modérateur
Posté le 23-01-2008 à 20:14:58  profilanswer
 

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
n°1675922
jeunestoma​c
Posté le 23-01-2008 à 20:23:04  profilanswer
 

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 ^^

n°1675939
jeunestoma​c
Posté le 23-01-2008 à 21:29:48  profilanswer
 

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 ?

n°1675960
Flaie
No it's necessary
Posté le 23-01-2008 à 22:40:22  profilanswer
 

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!
n°1675966
jeunestoma​c
Posté le 23-01-2008 à 23:00:39  profilanswer
 

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

mood
Publicité
Posté le 23-01-2008 à 23:00:39  profilanswer
 

n°1676349
Emmanuel D​elahaye
C is a sharp tool
Posté le 24-01-2008 à 16:50:25  profilanswer
 

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/
n°1676374
ngkreator
Posté le 24-01-2008 à 17:29:31  profilanswer
 

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

n°1676541
ptitchep
Posté le 24-01-2008 à 23:13:50  profilanswer
 

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
n°1676572
Emmanuel D​elahaye
C is a sharp tool
Posté le 25-01-2008 à 06:45:28  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Probleme de malloc sur un tableau de pointeur.

 

Sujets relatifs
Problème d'affichage des caractèresun problème avec les sockets :(
[Résolu]Problème avec un menu défilant[PHP] conditions multiples dans un switch - problème de design pattern
Problème d'utilisation des objets définis par l'utilisateur[C] intercaler des elements au milieu d'un tableau
Onclick sur un tableauProblème avec overflow et sa barre...
[C] problème avec scanf()[Resolu] Ajout dynamique onclick et problème d'auto-execution
Plus de sujets relatifs à : Probleme de malloc sur un tableau de pointeur.


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR