C : cahr *tab --> allocation dynamique
Résoluvoilà, 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.
++
--
~ iclic @ gauch,iclic, iclic @ droate, iclic, iclic
et ya pas de bôg môsieu ! ~
14 réponses
Création d'un tableau de char * dynamiquement alloué en C et l'ajout d'éléments posent le problème principal, à savoir allouer exactement la place nécessaire pour chaque pointeur. Certaines solutions préconisent d'utiliser un tableau de pointeurs vers char et d'allouer chaque élément séparément, plutôt que d'allouer directement des caractères, afin de gérer correctement les tailles et les copies. Exemple typique montre la définition d'un char **tab; l'allocation se fait pour le nombre d'éléments, puis chaque élément reçoit une référence à une chaîne existante ou une copie allouée, et enfin tab est libéré.
-
ContributeurQuestion à Sam3000 :
Comment ca se passe pour un tableau 2D de char * ?
Je pensais faire un typedef TRUC char *t[2];
Puis faire un pointeur qui se déplace dessus à ta facon,
c'est correct ?
-
la photo par exemple est tres ressemblente !!! :P
-
si tu regardes son profil, je ne pense pas...
-
Contributeur?? Tu es pas le Sam que je connais toi ?! Attention pas de blague..
-
waw, j'apprend tous les jours avec kij :)
-
mais non ca n'avance pas ... tu n'as donc pas compris.... ct juste comme ça...just for fun !!
-
-
-
Contributeur@m0n0-le-14r3ah 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 !
-
-
ContributeurBonjours,
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... :) -
tiens bonjour kij...
-
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)-
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 :-/ -
-
-
Contributeurj'te remercie bien pour le coup de pouce.
++ -
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); }-
-
-
@SKZT'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...) -
Contributeur
-
-
ContributeurSais pas... tu m'fais quoi ? :D
-
oui, kij_82 !
chui la, je vais voir (combien tu paye l'heure :-) ) -
ContributeurPersonne pour répondre ?
Pas même mister Sam3000 ou Luffy ( ou qu'il est d'ailleur ? toujours vivant ? )
-
alleluia ! je suis réssucité! Prosternez-vous devant le grand LuFfY =)
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 !
-