[allocation dynamique] Realloc malloc et dimensions.
Salut,
2 questions :
1) Comment on realloue un vecteur (genre
Code:
1 2
| vecteur = (int*) malloc(N*sizeof(int));
???vecteur = (int*) realloc((int)(N/2)*sizeof(int)); ??? |
2) Y a t il une fonction qui permet de connaitre la taille d'un vecteur alloué dynamiquement(dans les librairies standards)
Merci very much!
Re: [allocation dynamique] Realloc malloc et dimensions.
Citation:
Envoyé par semheis
1) Comment on realloue un vecteur (genre
Code:
1 2
| vecteur = (int*) malloc(N*sizeof(int));
???vecteur = (int*) realloc((int)(N/2)*sizeof(int)); ??? |
Tout a fait !, cf man realloc :
Code:
1 2
|
void *realloc(void *ptr, size_t size); |
Attention,il faut voir si il a marche (!= NULL)!
Citation:
2) Y a t il une fonction qui permet de connaitre la taille d'un vecteur alloué dynamiquement(dans les librairies standards)
?? C'est a dire ? Savoir si la taille de ce que tu as alloue ? si tu ne t'en souviens plus ?
Donne un exemple...
Connaitre la taille alloué dynamiquement !!!!
Le seule moyen que je connaisse pour connaitre la taille alloué dynamiquement est d'aller lire dans la memoire quelques octets avant ton pointeur.
Les fonction malloc et calloc te renvois un pointeur sur une zone alloué, mais pour pouvoir liberer cette zone, des informations sont stocké juste avant ton pointeur. Dans ces informations, tu trouves la taille complete alloué (celle que tu peut utiliser + celle qui est utiliser pour ranger ces informations).
Donc si tu fait :
Code:
1 2 3 4
|
char* pt;
pt=(char*) malloc(sizeof(char)*100);
printf("%d",*(pt-2)); /* -1 , -2 ou -4 cela depend de la machine */ |
tu vas obtenir une taille qui sera legerement suppérieur à la taille que tu peut utiliser.
ATTENTION l'espace alloué est toujours >= a celui que tu as demandé donc si tu fais:
Code:
1 2
|
pt=(char*)malloc(sizeof(char)*1); |
il est fort possible que la taille alloué soit beaucoup plus grande que la taille d'un char.
Cette méthode n'est pas trés propre et surtout n'est pas du tout portable alors attention :wink: