Dans le cas présent, variable et tab sont des espaces en mémoire sur la pile (stack). Donc l'adresse précise n'est déterminée qu'au moment de l'éxécution.
Si ces champs avaient été déclarés en dehors d'une fonction, alors ils auraient été déclarés sur le tas (heap) et auraient eu une adresse fixée lors de la compilation (qui aurait ensuite été ajustée par le loader au moment du chargement du programme en mémoire).
Une petite erreur est de ne pas caster le retour du malloc(), d'ailleurs le compilateur devrait émettre un warning. Donc écrire :
tab=(float *)malloc(10000*sizeof(float)); |
Ensuite, il n'y a pas de raison pour que tab[x], avec x compris entre 0 et 99999, empiète sur les autres variables, car la notation avec les crochets est équivalente à (adresse trouvée dans tab) + x, et non pas à (adresse de tab) + x.