Partage
  • Partager sur Facebook
  • Partager sur Twitter

Declarer un tableau sans connaitre sa taille

utilisation de malloc ?

Sujet résolu
24 novembre 2012 à 20:50:05

Bonsoir, je souhaite utiliser un tableau pour ranger des chaine de caractrères. Je ne connais pas sa taille. Seulement sa taille max.
Pour cela jutilise un tableau de pointeur.

char **tab = (char**) malloc (tailleMaxDeMonTableau);


Donc dans chaque tab[i] je peux metre un pointeur vers une str non ?
Pour cela :
tab[0] = (char*)malloc(strlen(maStr));


Qu'en pensez vous ?
en vous remerciant ! :)
  • Partager sur Facebook
  • Partager sur Twitter
24 novembre 2012 à 20:52:52

tab[0] = malloc(strlen(maStr) + 1); pour stocker le '\0'.
  • Partager sur Facebook
  • Partager sur Twitter
24 novembre 2012 à 20:57:53

En effet merci.

Et si je ne connais aucune taille pour mon tableau, comment je fais pour la faire évoluer au fur a mesure ?
Comment puis je le déclarer sans que mon compilateur ne me tape ?

Des que j'ai connaissance de la str que je dois enregistrer. Je n'ai juste qu'a faire des malloc sur les différents tab[i] ? Pas sur le tableau lui meme ?

Merci en tout cas !
  • Partager sur Facebook
  • Partager sur Twitter
24 novembre 2012 à 20:59:19

oui, mais plus propre :
tab[0] = malloc((strlen(maStr) + 1) * sizeof(char));


En effet sizeof(char) vaut 1, mais ça pourrait peut-être changer..

___________

Citation

Et si je ne connais aucune taille pour mon tableau, comment je fais pour la faire évoluer au fur a mesure ?


realloc ou (un nouveau tableau et une recopie avant de supprimer l'ancien) ?

___________

Citation


Des que j'ai connaissance de la str que je dois enregistrer. Je n'ai juste qu'a faire des malloc sur les différents tab[i] ? Pas sur le tableau lui meme ?



Exact.
Mais si ta taille max est constante, t'es pas forcé d'utiliser malloc
n'utilise malloc que si tu ne connais pas la taille du tableau avant l'appel du programme ^^
___________

Citation


Comment puis je le déclarer sans que mon compilateur ne me tape ?


Ce qui est alloué manuellement n'est pas déclaré dans le code à proprement parler.
En revanche on déclare le pointeur qui stockera l'adresse du tableau qu'on allouera plus tard avec malloc !
  • Partager sur Facebook
  • Partager sur Twitter
perror(const char * str); will save your life !
24 novembre 2012 à 21:04:51

de rien :p
  • Partager sur Facebook
  • Partager sur Twitter
perror(const char * str); will save your life !
25 novembre 2012 à 0:37:01

Tu peux sinon utiliser des listes chaînées. C'est plus complexe que des tableaux, mais beaucoup beaucoup plus flexible. Pas besoin de s'embêter avec realloc, ni même de connaître aucune taille avant l'exécution du programme. Le meilleur c'est qu'on peut stocker d'autres informations à côté. Je t'invite à aller jeter un oeil sur les tutos du sdz à ce propos.
  • Partager sur Facebook
  • Partager sur Twitter
25 novembre 2012 à 12:38:09

Effectivement, les listes chaînées sont une bonne solution.
Voici tout de même les pours/contres :
  • Les listes chaînées n'existent pas dans le C : il va falloir les coder (pas trop dur, quand on connait la théorie)
  • Les elements de la liste ne se trouve pas côte à côte en mémoire :
    • Chaque element connait (l'adresse de) l'element qui le suit, en plus de sa valeur
      • Une liste chainée prend donc plus de mémoire
        • S'il s'agit d'une liste d'adresses ou d'entiers, elle prendra 2x plus de place qu'un tableau d'adresses/d'entiers
    • Cela permet une fragmentation de la mémoire (pas de gros blocs)
    • Cela implique que ce sera plus long d'aller chercher un element (il va falloir parcourir la liste)
      • La recherche d'un element n'est pas constant.
        Le premier element est trouvé directement, le dernier sera trouvé après avoir parcouru la liste entiere
    • L'ajout/suppression d'un element est plus rapide (on gère des éléments, pas un gros bloc; en revanche il va falloir parcourir la liste pour trouver l'element)

Citation

Le meilleur c'est qu'on peut stocker d'autres informations à côté.


On peut aussi faire des tableaux de structures ;)

Citation

ni même de connaître aucune taille avant l'exécution du programme.


Comme pour un tableau alloué manuellement ^^

En reprenant les schemas que j'avais fait pour les fichiers (en blocs collés/blocs chainés) qui reprennent un peu le même principe :
Image utilisateur
Avec les tableaux
Image utilisateur
Avec les listes

Ici les blocs qu'ils soient chainés ou non ont une taille fixe donc ils prennent le même espace,
cependant on peut mettre moins de donnée dans un bloc chaîné car ce dernier doit connaître l'adresse du suivant.

Nous nos elements prendront plus de place, mais contiendront autant de donnée qu'une case de tableau.




En reprenant l'image de ce tuto : http://www.siteduzero.com/tutoriel-3-3 [...] chainees.html

Image utilisateur
  • Partager sur Facebook
  • Partager sur Twitter
perror(const char * str); will save your life !
7 mars 2022 à 10:20:17

Bonjour, comment faire pour  initialiser un tableau de caractères dont je ne connais pas par avance le nombre de caractere à mon avis c'est tab[0]=(char*)*malloc(...?  est ce possible de m aider merci bcp!
  • Partager sur Facebook
  • Partager sur Twitter
7 mars 2022 à 10:38:30

Bonjour,

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois (et, oui, 9 ans, ça fait plus que deux mois), mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

-
Edité par Lamecarlate 7 mars 2022 à 10:39:47

  • Partager sur Facebook
  • Partager sur Twitter

Pas d'aide concernant le code par MP, le forum est là pour ça :)