C : cahr *tab --> allocation dynamique
Résolu
kij_82
Messages postés
4089
Date d'inscription
Statut
Contributeur
Dernière intervention
-
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
kij_82 Messages postés 4089 Date d'inscription Statut Contributeur Dernière intervention -
Bonjours,
voilà, aujourd'hui je suis pas top en forme alors g pas trop envis de me casser la tete pdt 15 plombe sur un truc dont je ne me souvient plus, alors je m'en remet à votre expéreince : mon pb est le suivant : je voudrais créer un tableau de char * dynamiquement, pour cela, au fur et à mesure que je met des éléments dans mon tableau, je dois allouer de la place dans celui-ci pour y placer l'élément. Les éléments sont toujours des char * et on connait leur taille, comment fdaire donc ?
Le C pour moi c'est tres loin, alors si des gens peuvent m'aider, merci beaucoup :)
ps : c'est un tableau à deux entrées destiné à mémoriser les resultats de requetes.
moi je mettrais un truc du genre, mais est-ce bon ? :
Est-ce que cela est correct. La je vais manger alors j'ai pas tester en fait,
merci.
++
voilà, aujourd'hui je suis pas top en forme alors g pas trop envis de me casser la tete pdt 15 plombe sur un truc dont je ne me souvient plus, alors je m'en remet à votre expéreince : mon pb est le suivant : je voudrais créer un tableau de char * dynamiquement, pour cela, au fur et à mesure que je met des éléments dans mon tableau, je dois allouer de la place dans celui-ci pour y placer l'élément. Les éléments sont toujours des char * et on connait leur taille, comment fdaire donc ?
Le C pour moi c'est tres loin, alors si des gens peuvent m'aider, merci beaucoup :)
ps : c'est un tableau à deux entrées destiné à mémoriser les resultats de requetes.
moi je mettrais un truc du genre, mais est-ce bon ? :
char *tab = null; int i = 0; char *element = "ici"; int taille = 4; for(i=0;i<4;i++){ tab[i] = malloc((char *)taille*sizeof(char)); tab[i] = element; }
Est-ce que cela est correct. La je vais manger alors j'ai pas tester en fait,
merci.
++
14 réponses
Personne pour répondre ?
Pas même mister Sam3000 ou Luffy ( ou qu'il est d'ailleur ? toujours vivant ? )
Pas même mister Sam3000 ou Luffy ( ou qu'il est d'ailleur ? toujours vivant ? )
non, c'est pas bon ça! ce que tu fais là c'est allouer des caracteres, alors que tu doit allouer des pointeurs:
#include <stdio.h> #include <stdlib.h> void main() { int i = 0; char **tab; char *element = "ici"; int taille = 4; tab = (char **) malloc(taille * sizeof(char *)); for(i=0;i<taille;i++) { *(tab+i) = element; } for(i=0;i<taille;i++) { printf("%s\n",*(tab+i)); } free(tab); }
T'a déjà un tableau 2D dans cet exo.
La première dimension est le N° de chaine et la deuxième, le N° de caractère.
Si tu parle d'un char *tab[][] (un tableau 3D de caractère, soit 2D de chaînes de caractères), ben... T'alloue d'abors le nombre de colonnes (on considère que c'est la première dimension.)
Ensuite pour chaque colone col, tu alloue le pointeur
tab[col], qui correspond aux vecteurs colonnes de la matrice (chaque colonne est composé de N chaines, N peut varier avec la colonne).
Puis, pour chaque ligne de chaque colonne, il faut encore allouer tab[col][line], chaque chaine de caractère (ou, affecter une chaine récupérée quelque part, à condition d'être sûr que c'est toi qui dois la désallouer).
Pour libérer le tableau, c'est l'inverse : pour chaque ligne de chaque colonne, tu fais un free(tab[col][line]); puis pour chaque colonne un free(tab[col]); et enfin, un free(tab); pour libérer le tableau de colonnes.
Quand je parler de taille différente, l'idée est de mettre 6 chaînes de caractère dans le tableau.
Le problème est la chaîne "ici", qui a, on est d'accord, une taille de 3 carcatères, occupe un espace mémoire de 4 octets.
En effet écrire
char chaine[] = "ici";
est strictement équivalent à
char chaine[] = {'i', 'c', 'i', '\0'};
(Pour le SIGSEGV, c'est quand on déborde de la mémoire...
Un instant j'ai cru que Sam débordait...)
La première dimension est le N° de chaine et la deuxième, le N° de caractère.
Si tu parle d'un char *tab[][] (un tableau 3D de caractère, soit 2D de chaînes de caractères), ben... T'alloue d'abors le nombre de colonnes (on considère que c'est la première dimension.)
Ensuite pour chaque colone col, tu alloue le pointeur
tab[col], qui correspond aux vecteurs colonnes de la matrice (chaque colonne est composé de N chaines, N peut varier avec la colonne).
Puis, pour chaque ligne de chaque colonne, il faut encore allouer tab[col][line], chaque chaine de caractère (ou, affecter une chaine récupérée quelque part, à condition d'être sûr que c'est toi qui dois la désallouer).
Pour libérer le tableau, c'est l'inverse : pour chaque ligne de chaque colonne, tu fais un free(tab[col][line]); puis pour chaque colonne un free(tab[col]); et enfin, un free(tab); pour libérer le tableau de colonnes.
Quand je parler de taille différente, l'idée est de mettre 6 chaînes de caractère dans le tableau.
Le problème est la chaîne "ici", qui a, on est d'accord, une taille de 3 carcatères, occupe un espace mémoire de 4 octets.
En effet écrire
char chaine[] = "ici";
est strictement équivalent à
char chaine[] = {'i', 'c', 'i', '\0'};
(Pour le SIGSEGV, c'est quand on déborde de la mémoire...
Un instant j'ai cru que Sam débordait...)
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
de rien, laisse moi aider les filles maintenant!
je rigole :), j'aide tous le monde. (j'espere que quelqu'un pourra m'aider quand j'en aurais besoin)
je rigole :), j'aide tous le monde. (j'espere que quelqu'un pourra m'aider quand j'en aurais besoin)
de rien, laisse moi aider les filles maintenant!
Kedal tu m'les laisse !!!
:-P
Pour répondre à ta citation (je m'acharne un peu sur ce post, mais en vrai je suis gentil) :
La Shoha n'avait rien d'informatique (et je suis pas juif, pour peuve je sais pas écrire Shoa...)
C'est pas très programmation, je digresse :-/
Kedal tu m'les laisse !!!
:-P
Pour répondre à ta citation (je m'acharne un peu sur ce post, mais en vrai je suis gentil) :
La Shoha n'avait rien d'informatique (et je suis pas juif, pour peuve je sais pas écrire Shoa...)
C'est pas très programmation, je digresse :-/
Bonjours,
Sympa ton message, alors cette romance, c'en est ou ? ca cavance ? dommage que tu parte cet été... enfin moi j'dit ca mais j'dit rien... :)
Sympa ton message, alors cette romance, c'en est ou ? ca cavance ? dommage que tu parte cet été... enfin moi j'dit ca mais j'dit rien... :)
mais non ca n'avance pas ... tu n'as donc pas compris.... ct juste comme ça...just for fun !!
ah ouai... (tiens tiens, fort intéressant ca... :D ) Non je palisante, je suis un homme différent maintenant !! j'ai changé.. j'ai pris plein de résolution suite à cette année et certain dérapage lors de fete trop arrosée (comme une soirée à la salle des fetes par exemple...)
je suis plein de bonnes intention maintenant !
je suis plein de bonnes intention maintenant !
nan mais en fait chuis à l'école en ce moment, et en plein dans les révisions, donc plus tropde temps à consacrer au forum...
Mais je voles volontiers à ton secours quand tu es en difficulté kij =)
sauf que là, ben Dieu m'a réssucité trop tard !