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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
Voiture * tab=malloc(2*sizeof(*tab)); // <=> malloc(2*sizeof(Voiture)); ??
tab[0] est une Voiture et non une Voiture * ?

Merci.