Bonjour à tous
J'ai été confronté récemment à une interrogation à propos de la nécessité du static. Le problème (réduit à son minimum) était le remplissage d'un tableau de pointeurs pris à partir d'un autre tableau.
Voici le code minimal (et compilable) d'illustration
1 2 3 4 5 6 7 8 9 10 11 12
| #include <stdio.h>
void remplir(char *tab[]) {
static char *orig[]={"toto", "titi", "tata"};
for (int i=0; i < 3; i++) tab[i]=orig[i];
}
int main() {
char *tab[3];
remplir(tab);
for (int i=0; i < 3; i++) printf("tab[%d]=%s\n", i, tab[i]);
} |
Je suis donc parti de l'idée que le tableau de remplissage (ici "orig") devait être static pour qu'il perdure au delà de la fonction et que les pointeurs copiés dans "tab" soient toujours valides même après avoir quitté la fonction.
Puis, j'ai été pris d'un doute. En effet, ce n'est pas "orig" qui importe, mais son contenu. Et ce contenu, lui, provient de la zone (je ne me souviens plus son nom) qui contient les strings écrites en dur, exactement comme quand on écrit
char *nom="toto". Bref, ayant sauvegardé les adresses de ces 3 strings dans "tab", adresses qui, elles restent inaliénable, que "orig" reste ou disparaisse importe peu.
Voilà l'objet de mon questionnement. Le tableau "orig" nécessite-t-il de rester en static ou pas ? Accessoirement sans "static" ça compile et ça fonctionne aussi.
Merci à tous.
Partager