Allocation statique

Signaler
Messages postés
71
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
12 août 2004
-
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004
-
slt
je réalise une application MFC et ds une de mes classes j'ai fais l'allocation ds le constructeur de la façon:
chemain=new char[MAX_PATH+1];
comme j'ai l'habitude de faire mais on m'a proposé de faire une allocation statique vue que le nombre d'octet à allouer est tjrs fixe
j'ai pas compris ça!!!
si quelqu'un à une idée ,qu'il m'aide
merci d'avance!!!!!!!
:blush)
A voir également:

14 réponses

Messages postés
71
Date d'inscription
mardi 30 mars 2004
Statut
Membre
Dernière intervention
12 août 2004

est ce que cela veut dire tout simplement travailler avec des tableaux de caractères
:blush)
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
2
Imagine un char szBuff[512];
Tu as un buffer de 512 octets, dans lequels tu peux te déplacer grace au pointeur (adresse qui pointe sur cette zone mémoire).

strcpy(szBuff+256, "bonjour");
MessageBox(GetFocus(), szBuff+256, "debug", 0x40);

Affiche par exemple les octets qui se trouve à la 256eme position de ton buffer jusqu'a un 0 final.

Quoi voilà après tu peux ce que tu veux dans cet espace memoire et t'y déplacer grace à un pointeur.

@+
Arnotic,
Admin CS, MVP Visual C++
Messages postés
48
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
26 juillet 2005
3
Salut,

Cela signifie tout simplement qu'au lieu d'avoir :

class LaClasse {
...
private :
char * chemain;
...
};

dans ta classe, tu peux écrire :

private :
char chemain[MAX_PATH + 1];

et que tu peux enlever :
chemain=new char[MAX_PATH+1];
de ton constructeur, et :

delete [] chemain; de ton destructeur

Voilà c'est tout :)

P.S : Dans les deux cas tu travailles avec des tableaux de caractères.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
et le constructeur de copie et l'operateur = ??
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

une allocation statique est une allocation mémoire qui se fait en gros en entrant dans un bloc ("{ ... }"); elle est statique car les emplacements mémoires sont déjà prévus avant la compilation

ex: int i[10]; // 10 est bien une CONSTANTE

en revanche, une allocation dynamique est une allocation qui peut se produire n'importe quand dans un programme (non prévue avant compilation)

par ex:
int *n; /* ........... */
n = (int*)malloc( x * sizeof(int) ); /* x : VARIABLE (non nécessairement constante comme 10 au dessus) */

le C interdit par ex. l'allocation dynamique suivante : int i[ x ];
(même si t'as mis x = 10 juste avant avant)

(essirc donne un bon exemple ci-dessus : MAX_PATH est une constante avant la compilation car macro d'ou alloc. stat.)

@+
j'espère avoir été clair
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
c99 autorise int i[ x ]; si x est specifier const

le cast de malloc est inutile

en dynamique on alloue sur le tas et en statique dans la pile (pour une fonction)

plutot que faire

void func()
{
char c[ MAX_PATH ];
}

pour ne pas encombrer la pile on peut faire

void func()
{
static char c[ MAX_PATH ];

}

ou

void func()
{
char *c;

c = malloc( MAX_PATH );

free(c);
}

la premiere solution est la plus performante mais la zone memoire est la meme pour chaque appel
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

1: je parle du C, et la norme ne prévoit pas de faire int i[ x ];

2: le cast de malloc est certes (souvent) inutile mais fortement conseillé pour des raisons de portabilité : certains compileurs te gètent si tu ne fais pas le cast, ou tout simplement des warnings peuvent avoir lieu...

3: "en dynamique on alloue sur le tas et en statique dans la pile (pour une fonction) [...] "
tu as tout-à fait raison, mais je ne crois pas qu' imanewin32 attendait une réponse "technique" comme celle-ci, je ne suis pas sur qu'il va la comprendre (sinon il ne poserait pas des questions comme celle-là)

@bientot
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
"je parle du C, et la norme ne prévoit pas de faire int i[ x ];"

on parle pas de norme, le standard autorise int i[ x ]; si x est const, apres precise si tu parle de c ansi (c89) ou c99
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

tu as effectivement raison, j'ai dit une grosse annerie (je n'avais pas vu le qualifieur CONST dans ta phrase)

je voulais lui expliquer la diff entre stat. et dyn. simplement, de manière un peu vulgarisée, sans trop entrer dans tous les détails (notamment "const"), mais t'as raison de me le faire remarquer...

@bientot
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

tu as effectivement raison, j'ai dit une grosse annerie (je n'avais pas vu le qualifieur CONST dans ta phrase)

je voulais lui expliquer la diff entre stat. et dyn. simplement, de manière un peu vulgarisée, sans trop entrer dans tous les détails (notamment "const"), mais t'as raison de me le faire remarquer...

@bientot
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
ok pas de probleme, pour le cast du malloc, je dirais juste que vu que la conversion d'un void* est implicite en c (meme si le compilo gueule, c'est un comportement illogique car void* est le type generique en c)

la seule raison de conserver le cast du malloc est pour la compatibilité en c++ (ou seul la conversion void* -> int* est implicite), mais c'est pas bien de melanger source c et c++ ;)
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

je suis d'accord ac toi...

mais je ne pensais même pas au c++ (bah que j'aime pas ça !!!, tout comme le java...), c'est juste pour éviter les warnings, ça fait désordre je trouve de créer des progs ac des warnings à foison, et je pense que bcp sont d'accord ac moi

mais c vrai qu'on ne devrait même pas avoir à le faire (je crois que même gcc chibre lorqu'on ne cast pas :(, sans vouloir dire des conneries )
ça améliore en revanche la lisibilité du programme je touve

salut !

peut être que tu vas pouvoir me dépanner ? :
quel model de mémoire est utilisé par les compilos C (notamment LCC ou GCC) ? (flat ?), car je n'arrive pas à linker deux .obj (1 ac .asm & 1 ac .C)

merci !
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
8
d'apres la doc c'est flat

pour le cast du malloc, pourquoi ca te parait plus claire avec ?

ca peut meme causer des bug si tu oubli l'entete stdlib.h lors de la compilation du source
Messages postés
19
Date d'inscription
vendredi 13 août 2004
Statut
Membre
Dernière intervention
17 août 2004

merci, c bien ce que je pensais, donc j'ai un autre prob... (je vais le poster ds qq jrs si je ne trouve pas). (ça m'énerve de buter sur un simple problème de liaison !!!!! qqc doit m'échapper...).

pour le cast du malloc, l'avantage est que l'on voit dirrectement quel est le type de la variable, et dans un gros programme, ça améliore un peu la lisibilité , je trouve (notamment qd t'as plein plein de variables).

j'inclus presque toujours <stdlib.h>, dc pas de prob :) .

@+