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

Question en langage C

D0OM
D0OM
Niveau 4
16 novembre 2003 à 20:02:13

Dans la portion de code suivante :

char *msg;
msg = " Hello ! ";

Que se passe il ? Le compilateur alloue il un espace mémoire pour " Hello ! " ? Cet espace est il libéré à la sortie du bloc de déclaration ( comme une variable automatique ) ? Mais dans ce cas, que se passe il ici :

char *test( void )
{
return " Hello ! "
}

? La chaine " Hello ! " est elle conservée en mémoire à ma sortie de la boucle ? Si oui comment est elle désalouée ? Sinon, si cette chaine est effacée à la sortie de la boucle ( comme les variable automatiques ) , comment fonctionnent les fonction du type strcat(...) qui retournent une chaine ?
Ce point du C m´est assez confus ( et j´ai trouvé les msg = " ..." dans le source de quake 3 ( mod ) )

D0OM
D0OM
Niveau 4
16 novembre 2003 à 21:01:37

:up:

JeanYvesYves
JeanYvesYves
Niveau 10
16 novembre 2003 à 23:38:31

msg = " Hello ! " ;

ça marche ça ? ?

normalement ça ne devrait pas marcher !

ça ne marche que si on initialise en meme temps que l´initialisation.

char* msg = " Hello ! " ;

d´un autre coté, peut etre que ton compilo est + tolérant, mais ce n´est pas normé ANSI, donc imprévisible et surtout : pas a faire.

Kelios
Kelios
Niveau 8
17 novembre 2003 à 02:21:08

Un topic intéressant? :hap: Merci, seigneur!

JYY a raison sur ce point, je crois, quoique je n´en suis pas sur à 100%.

" Que se passe il ? Le compilateur alloue il un espace mémoire pour " Hello ! " ? "
Le principe pour des programmes de type PE ( portable executable, soit ce que tu es habitué si tu es sous windows) est d´avoir un, si on veux endroit où stoker des constantes, qui sera loadé intégralement en mémoire par l´OS. Elle s´appelle " .rdata".

Le compilateur se permet alors de mettre des chaines de caractères explicites comme ça dans cette zone.

" Cet espace est il libéré à la sortie du bloc de déclaration ( comme une variable automatique ) ? "
Le pointeur le sera, étant sur 32 bits. La chaîne, elle, ne le sera pas, elle est dans une zone " constants".

"
char *test( void )
{
return " Hello ! "
}
"
Ça peux dépendre énormément de ton compilo, mais en gros, le return " Hello!" retournera un pointeur vers cette zone de mémoire constante.
Je ne crois pas que c´est accepté selon la norme ANSI, mais si ça l´était ou l´est, cela signifierait une chose particulière; cette zone de mémoire n´a pas de notions de " scope", de blocs: elle est donc globale, si on veux.

" La chaine " Hello ! " est elle conservée en mémoire à ma sortie de la boucle ? "
Tout à fait. Elle le sera tout le long du programme en fait. Elle le sera même, si on extrapole, avant que le programme roule ^^

" Si oui comment est elle désalouée ? "
N/A. Le mécanisque de désallocation de cette zone, par contre, est dépendante de l´OS.

" Sinon, si cette chaine est effacée à la sortie de la boucle ( comme les variable automatiques ) , comment fonctionnent les fonction du type strcat(...) qui retournent une chaine ? "
Elle ne l´est pas. Quant à strcat, le principe est que la chaîne créée l´est dans le Heap ( Principe d´allocation et désallocation de mémoire), puisque nous ne pouvons pas savoir d´avance quel sera la taille des chaînes à assembler. Une exception serait des chaînes constantes de la zone " constants" uniquement, mais cela ne serait valable qu´avec une autre strcat surchargée basée uniquement sur les constantes, quelque chose d´hyper dépendant du compilo.

J´espère avoir pu t´éclaircir ces points.

Kelios
---------

D0OM
D0OM
Niveau 4
17 novembre 2003 à 19:00:23

Petite erreur de ma part, ca ne vient pas du source de quake3 mais d´un tuto pour faire un mod, voila le code :

/*
=================
Cmd_Cloak_f
=================

  • /

void Cmd_Cloak_f( gentity_t *ent ) {

char *msg; // CA COMMENCE ICI

ent->flags ^= FL_CLOAK;

if ( !(ent->flags & FL_CLOAK)) {
msg = " Cloaking OFF\n"; // BOUM
ent->client->ps.powerups[PW_INVIS] = level.time;
// Removes the invisible powerup from the player
}
else {
msg = " Cloaking ON\n"; // RE-BOUM
ent->client->ps.powerups[PW_INVIS] = level.time + 1000000000;
// Gives the invisible powerup to the player
}

trap_SendServerCommand( ent-g_entities, va("print \"%s\"", msg));
}

ET POURTANT CA MARCHE ! ET SOUS VISUAL C++ 6.0 EN PLUS !

En tout cas merci pour vos remarques ( Kelios, comment tu sais tout ca a t´on age ? T´apprends dans les livres ? les tutos ? :) )
Mais ca veut dire que si ma chaine reste dans cette zone mémoire à constantes, il risque d´y avoir un moment ou la mémoire seras saturée, non ?

Lightness1024
Lightness1024
Niveau 10
17 novembre 2003 à 21:42:58

VC++6 est TRES tolérant et bcp de choses marchent avec ki ne marcherait pas sur d´autres.

de plus cette structure est valide en programmation C meme si elle est moche.

le pointeur pointe vers la zone des constantes ou hello est allouée et stoquée au lancement de l´exe.

D0OM
D0OM
Niveau 4
18 novembre 2003 à 12:53:13

Ok merci

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