GROFRED a écrit :
non non il accepte le tableau rempli...Concernant les allocations mémoire je pensais qu'écrire:
double TABMAX[72000];
ça permettait d'allouer la mémoire nécessaire une fois pour toute (dans l'hypothèse ou ç'est possible) et que malloc permet d'allouer dynamiquement de la mémoire c'est à dire pour moi agrandir la taille du tableau pendant l'exécution du prog. Dois-je comprendre que malloc "force" une allocation mémoire qui ne serait pas possible en faisant:
double TABMAX[72000];
?
|
Il te faut comprendre la différence entre pile et tas. Disons simplement que la pile a une taille limitée fixée à la compilation, et sert à stocker temporairemet les données locales aux fonctions. Au fur et à mesure des appels de fonctions, ces données locales s'empilent.
Le tas est au contraire un espace mémoire global que l'appli peut réserver.
Si tu fais
int tab[100];
tu réserves sur la pile. Il faut être parcimonieux avec la pile, parce qu'il est facile de la saturer et il n'y a pas moyen de savoir si c'est le cas sauf d'attendre le plantage (qui ne tarde pas à arriver d'ailleurs).
Si tu fais int *tab = malloc(10000);
tu réserves sur le tas. tab est alors un pointeur qui contient l'adresse de début de l'espace réservé par malloc. L'avantage, c'est que si malloc retourne 0, tu sais que l'OS ne t'accorde pas la mémoire que tu as demandé (tu as dépassé la limite du possible à cet instant).
Mais par la suite, pour pouvoir utiliser cet espace, tu dois savoir utiliser les pointeurs.
ps : une donnée dite "locale" est une donnée dont l'espace mémoire est automatiquement déclaré comme réutilisable à la sortie d'un bloc, un bloc étant défini par un couple {...} (Donc une fonction définit un bloc).
Autrement dit, dans le bloc suivant :
{
int a = 3;
short tab t[100];
...
}
a et tab sont alloués sur la pile. A la sortie du bloc, a et tab n'existent plus et toute tentative de les lire ou de les écrire sera une erreur à la compilation. Leur portée est locale au bloc.
Par contre si j'écris:
{
double *tab = malloc(50*sizeof(double));
}
tab est alloué sur le tas et existe encore à la sortie du bloc jusqu'à ce qu'on écrtive free(tab). Sa portée est globale.
http://forum.hardware.fr/hardwaref [...] 6641-1.htm
http://www-igm.univ-mlv.fr/~desar/ [...] on/ch4.pdf
Pour en savoir plus :
http://www.enseignement.polytechni [...] 9/view.pdf
Message édité par el muchacho le 22-11-2004 à 14:38:34