char *, string et tableau statique ou dynamique
bonjour, j'aurais qq questions sur les pointeurs. Je vous dis ce que je sais (ou crois savoir) et j'aimerais que vous me donniez votre avis.
1) si je fais
alors tab est un tableau à deux composantes et chaque éléments de tab est un T. Donc si T est une structure (par exemple Voiture), j'accède à ses champs par l'intermédiaire du point tab[0].pneu; tab[0].porte
2) si je fais
Idem que 1) sauf que chaque éléments de tab est un pointeur sur un T et donc je fais tab[0]->pneu; tab[0]->porte
3) Là est ma question
Code:
1 2
|
T * tab=malloc(2*sizeof(*tab)); |
et là je ne comprends pas : chaque éléments de tab est un T ou un T * ??
tab[0] est un Voiture * ou un Voiture ?
Pour faire simplement, voici mon code (qui marche)
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
#include<stdlib.h>
#include<stdio.h>
int main()
{
char * t[2];
t[0]="CH3";
t[1]="CH4";
t[2]="CH2";
int i;
for(i=0;i<3;++i)
printf("t[%d] = %s\n",i,t[i]);
char **tab=malloc(3*sizeof(*tab));
tab[0]=t[0];
tab[1]=t[1];
tab[2]=t[2];
for(i=0;i<3;++i)
printf("tab[%d] = %s\n",i,tab[i]);
free(tab);
return 0;
} |
J'ai donc 2 questions :
1) t est un tableau de dimension 2. Pourquoi t[2] existe ? Ca devrait planter non ? Est-ce à moi de faire les tests de dépassements de tableau ? (Au vu de ce code je pense que oui). Mais est-ce que l'adresse mémoire de tab[2] pourra être effacé n'importe quand ou sera-t-elle effacée lorsque t sera détruit ?
2) Avec mon tab, je voulais faire un tableau dynamique donc chaque composante est un char * (donc une string si j'ai bien compris).
Au début j'avais fait
Code:
1 2
|
char *tab=malloc(3*sizeof(*tab)); |
(cf ma question 3). Au vu de ce code, j'ai l'impression que tab[0] est un char et non un char* d'où mon
Code:
1 2
|
char **tab=malloc(3*sizeof(*tab)); |
où là tab[0] est un char * . Donc, d'après ce test, si je fais
Code:
1 2
|
Voiture *tab=malloc(3*sizeof(*tab)); |
tab[0] est une Voiture (et non une Voiture *) et donc je dois faire tab[0].pneu, et si je fais
Code:
1 2
|
Voiture **tab=malloc(3*sizeof(*tab)); |
tab[0] est une Voiture * et donc je dois faire tab[0]->pneu.
Est-ce correct ?
Mais pourquoi si je fais
tab[0] est une Voiture * et si je fais
Code:
1 2
|
Voiture * tab=malloc(2*sizeof(*tab)); // <=> malloc(2*sizeof(Voiture)); ?? |
tab[0] est une Voiture et non une Voiture * ?
Merci.