CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

(C) Structures et allocation dynamique

lag-it
lag-it
Niveau 10
07 juillet 2006 à 11:52:00

Bonjour,

J´utilise des structures de données contenant un pointeur vers un char (destiné à recevoir une chaine de caractère de longueur arbitraire après allocation) de la forme :

typedef struct
{
// ...

char *chaine;
}
Structure;

(Notez que le char* est la dernière variable décla
rée, ce détail a son importance pour la suite)

Comme les instances de cette structure sont elles aussi allouées dynamiquement, l´initialisation complète d´une telle instance nécessite :

1/ L´allocation de la mémoire nécessaire à la structure
2/ L´allocation de la mémoire nécessaire à la chaine

Or je me demandais s´il n´était pas possible de se ramener à une unique allocation de mémoire, pour simplifier les choses et améliorer les performances, en procédant de la sorte :

Structure *instance;

instance =
(Structure*)malloc(sizeof(Structure)+longueurChain
e*sizeof(char));

instance->chaine = &(instance->chaine+sizeof(char*));

Ca me parait valide, mais si quelqu´un pouvait me le confirmer...

dnob700
dnob700
Niveau 10
07 juillet 2006 à 12:47:58

Ca me semble bien (sauf que ce n´est pas &(instance->chaine+sizeof(char*)) mais &(instance->chaine)+sizeof(char*)).

Le seul défaut c´est que tu ne sais plus rien sur l´alignement de tes données. Comme les chars font 1 octet ce n´est pas grave, mais je me demande si dans le cas où tu utiliserais des wchar_t ou des trucs comme ça, ce n´est pas un problème qu´il faudrait prendre en compte (mais je ne connais pas assez bien le problème pour en être sûr).

Fvirtman
Fvirtman
Niveau 10
07 juillet 2006 à 13:01:13

ça me parait bien comme truc !

j´ai déja une remarque :
si tu mets ta chaine a la fin de ta structure, pourquo laisser le char* qui pointe dessus ? a priori tu n´en as plus besoin
(sauf si c´est pour faciliter l´écriture apres)

par pour y accéder, il te suffira de faire :

char* c = (char*)&ma_struct + sizeof(ma_struct);

ce qui est certes un peu plus lourd que :
ma_struct->chaine

Sinon, hormis cela, je dirais que le probleme de décalage de données n´est est pas vraiment un a condition que tu utilises bien sizeof

En effet, imaginons que tu veuilles rajouter des données a une telle structure :

struct test
{
int a;
char b;
}

le sizeof de cette struct est bien 8 et non 5 pour aligner sur la donnée suivante, meme si c´était un tableau de int.

C´est mon avis, bien sur, je peux me tromper.

bref, c´est une bonne idée, le débat est intéressant :-)

lag-it
lag-it
Niveau 10
07 juillet 2006 à 14:16:18

dnob700 > Oui en effet, petit problème de parenthesage.
Au fait ca c´est bien passé les concours ?
Moi j´ai été admissible (je passe les oraux la semain prochaine) CCP et quelques écoles du concours Centrale et je pense faire 5/2.

Fvirtman > Concernant la présence d´un char*, c´est principalement pour simplifier les utilisations utltérieures (parce que bon, faut avouer que cette allocation, si elle est pratique, fait un peu "magouille", et j´essaie d´éviter les (char*)&ma_struct + sizeof(ma_struct) pour l´utilisateur par la suite dès qu´il voudra s´en servir)

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment