probleme allocation memoire

probleme allocation memoire - C - Programmation

Marsh Posté le 24-02-2005 à 09:56:08    

Bonjour,
je suis en licence info et g un petit td a faire (ex3 du td2 ici pour ceux que ca interessent : http://dept-info.labri.fr/~fortin/ens/PS/sujets/TD2/)
 
mon probleme est le suivant est-il possible d'allouer une zone memoire avec malloc et de s'en servir a sa guise apres. En effet j'aimerais y metre des pointeurs de type void* a des endroits bien precis de cette zone memoire (se pointant dailleur entre eux mais c'est pas le probleme).
 
j'ai penssais a une solution qui consisterait a declarer une copie du pointeur normalement puis via un memcpy je le replacerai dans ma zone memoire à l'endroit voulu. je vais essayer ca mais je post a tout hazar (peut etre que malloc n'est pas la fonction a utiliser)

Reply

Marsh Posté le 24-02-2005 à 09:56:08   

Reply

Marsh Posté le 24-02-2005 à 10:12:24    

ça s'appelle un pool. malloc t'alloue une zone mémoire correctement aligné pour y mettre ce que tu veux.

Reply

Marsh Posté le 24-02-2005 à 10:24:44    

ah  t'a l'air de ty connaitre :), mais le probleme c'est que je ne sais pas comment definir des pointeurs dans cette zone memoire.

Reply

Marsh Posté le 24-02-2005 à 10:33:45    

déjà dans ton sujet : est-ce que le type de objets du pool est connu à la compilation ou bien est-ce que tu vas instancier
 
new_pool(taille_objet); ?

Reply

Marsh Posté le 24-02-2005 à 10:39:45    

oué le type est connu (enfin la taille du type l'est)
 
edit : attends, t'embettes pas, je crois que j'avais mal compris le sujet... je pense pas avoir a faire ca en fin de compte
 
 


Message édité par klems le 24-02-2005 à 10:41:45
Reply

Marsh Posté le 24-02-2005 à 11:06:15    

bah moi si, je comprends ça : un allocateur rapide pour une série d'objet de même taille, taille connue à la compilation.
 
en gros la base ça va être
 
union { Link *next; TaStruct o; }
 
comme ça si c'est pas utilisé tu chaine

Reply

Marsh Posté le 24-02-2005 à 11:15:43    

Taz a écrit :

bah moi si, je comprends ça : un allocateur rapide pour une série d'objet de même taille, taille connue à la compilation.
 
en gros la base ça va être
 
union { Link *next; TaStruct o; }
 
comme ça si c'est pas utilisé tu chaine


 
oué je comprend mais je dois etre bete (le C c'est vraiment pas mon truc, je suis plutot C# et Java) : je vois toujours pas comment definir mes pointeurs dans ma zone allouée. J'ai chercher a comprendre ton histoire de pool via google mais je trouve rien qui parle de pool en C (la plupart des liens traitent de bases de données).


Message édité par klems le 24-02-2005 à 11:16:03
Reply

Marsh Posté le 24-02-2005 à 11:17:58    

moi je comprends pas ce que tu n'arrives pas à comprendre
 
quand tu as
 
char *p = malloc(100);
 
si tu as envie, tu peux faire
 
char *q = p + 50;

Reply

Marsh Posté le 24-02-2005 à 11:21:13    

Taz a écrit :

moi je comprends pas ce que tu n'arrives pas à comprendre
 
quand tu as
 
char *p = malloc(100);
 
si tu as envie, tu peux faire
 
char *q = p + 50;


 
ah , ben si je fais un truc de ce genre le compilo (ms c++) me geulle un truc du genre illegal redirection :/

Reply

Marsh Posté le 24-02-2005 à 11:22:00    

avec des void*, oui ça gueule. par avec des char

Reply

Marsh Posté le 24-02-2005 à 11:22:00   

Reply

Marsh Posté le 24-02-2005 à 11:23:05    

ahhhhhhhh, effectivement  :sweat:  
 
je suis un boulet visiblement

Reply

Marsh Posté le 24-02-2005 à 11:55:13    

mais si je veux faire des pointeurs void* qui pointent sur dautres pointeurs void* ca geulle :sweat:


Message édité par klems le 24-02-2005 à 11:55:27
Reply

Marsh Posté le 24-02-2005 à 11:56:19    

normal. Tu ne peux pas faire d'arithmétique avec des void*. Mais avec des char* (ou autre), tu peux.

Reply

Marsh Posté le 24-02-2005 à 11:59:14    

ah...
donc je suis plus ou mions dans la deche.Si je fait un pointeur char* ca va forcement pointer sur un char non? moi je veux pointer sur un autre pointeur d'adresse


Message édité par klems le 24-02-2005 à 11:59:31
Reply

Marsh Posté le 24-02-2005 à 12:02:26    

klems a écrit :

ah...
donc je suis plus ou mions dans la deche.Si je fait un pointeur char* ca va forcement pointer sur un char non? moi je veux pointer sur un autre pointeur d'adresse


 
Alors je suppose qu'il faudra un cast.
Le problème d'un pointer void*, c'est que comme le type n'est pas connu, la taille de la donnée en mémoire n'est pas connue non plus, ce qui fait que tu ne peux pas incrémenter ou décrémenter ton pointeur, ça n'aurait pas de sens.
 
Avec un char* dont la donnée fait 1 octet (modulo les architectures exotiques), tu peux te déplacer octet par octet dans l'espace mémoire en incrémentant ou en décrémentant ton pointeur.
Ensuite à toi de le caster dans le bon type ..


---------------
Loose Change Lies | Bars | Last.fm
Reply

Marsh Posté le 24-02-2005 à 12:03:45    

KrisCool a écrit :

Alors je suppose qu'il faudra un cast.
Le problème d'un pointer void*, c'est que comme le type n'est pas connu, la taille de la donnée en mémoire n'est pas connue non plus, ce qui fait que tu ne peux pas incrémenter ou décrémenter ton pointeur, ça n'aurait pas de sens.
 
Avec un char* dont la donnée fait 1 octet (modulo les architectures exotiques), tu peux te déplacer octet par octet dans l'espace mémoire en incrémentant ou en décrémentant ton pointeur.
Ensuite à toi de le caster dans le bon type ..


 
ok je comprend mieux!! (merci pour ton aide au fait :whistle: )
 
Edit :  uhuh j'avais pas vu que tu n'etais pas taz, donc je vous remercie tous les deux ;)


Message édité par klems le 24-02-2005 à 12:16:46
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed