Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1346 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Persistance déclaration statique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Persistance déclaration statique

n°2049963
tequilatex
Viva Tequila
Posté le 18-01-2011 à 18:18:03  profilanswer
 


Bonjour à tous,  
 
Je me heurte à une question pour laquelle je ne trouve pas de réponse : la zone allouée par un tableau déclaré statiquement est-elle bien locale à la fonction, ou persistante en dehors ? J'ai écrit ce code :
 
/* ---BEGIN--- */
 
#include <stdio.h>
#include <stdlib.h>
 
typedef struct {
    int size;
    char * tab;
} Test;
 
void modif (Test* tst) {
    char* chaine = "TEST_AFFICHAGE";
    tst->size = 14;
    tst-> tab = chaine;
}
 
void affichage (Test tst) {
    int i = 0;
    for (i=0 ; i<tst.size ; i++)
        printf("%c\n",tst.tab[i]);
}
 
int main() {
    Test tst = {11, "DISPLAY_STR"};
    modif(&tst);
    affichage(tst);
    return 0;
}
/* ---END--- */
 
Ca m'affiche TEST_AFFICHAGE. Pourtant comme tst.tab pointe sur "chaine" qui est censé être local à modif(), l'espace est-il désalloué ? Est-ce donc un "coup de bol" parce que la mémoire n'a pas été réallouée, ou l'allocation persiste-t-elle ?
 
Merci d'avance !

mood
Publicité
Posté le 18-01-2011 à 18:18:03  profilanswer
 

n°2049975
Ydalb
In Crêpes n' Cidre I Trust!
Posté le 18-01-2011 à 18:46:29  profilanswer
 

Je pense que la mémoire attribuée à 'chaine' n'est pas persistante et risque d'être "écrasée" de manière aléatoire si tu fais d'autre déclaration de variable.
Il t'affiche la valeur de 'chaine' car 'chaine' existe bien en mémoire mais pour combien de temps ? Si tu veux le rentre persistant, un coup de malloc() fera l'affaire.
 
Je peux me tromper.


---------------
:o
n°2049976
tequilatex
Viva Tequila
Posté le 18-01-2011 à 18:46:43  profilanswer
 

Bon a priori j'ai trouvé la réponse...
 
Les déclarations entre quote sont manifestement inscrites à un endroit spécifique de la mémoire (section .rodata), qui reste alloué tout le temps de l'exécution. Réponse donnée par Tosh sur ce forum :
 
http://www.siteduzero.com/forum-83 [...] aines.html
 
Cela explique en outre pourquoi ces chaînes ne sont pas modifiables (pas accessible en écriture de tout évidence).

n°2049982
tequilatex
Viva Tequila
Posté le 18-01-2011 à 18:55:49  profilanswer
 

En fait il y a une différence entre ces deux déclarations :
 
char * tab = "TEST";
char tab[] = "TEST";
 
La 1e initialise un pointeur sur une chaîne "TEST" écrite dans la section .rodata ("Read Only DATA"...), tandis que la 2e initialise bien sur une zone allouée localement dans la mémoire.
 
Dans le bout de code précédent, on est donc tentés de remplacer "char * tab" par "char tab[]", mais on obtient alors l'erreur suivante lors de la compilation : "erreur : utilisation invalide d'un membre flexible de tableau"... Donc l'allocation dynamique est strictement nécessaire dès qu'on veut utiliser une chaîne modifiable.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Persistance déclaration statique

 

Sujets relatifs
EJB et persistance des données : bonnes pratiques[VBA] Déclaration automatique de tableaux
partie admin dans site statique ?PHP 5.3.3 déclaration d'un objet
Error - Java / PersistanceAccès dynamique à une classe pour appeler .... une méthode statique
Déclaration de tableau de char[C++] Map statique dans une classe
[Résolu] warning friend declarationVBA Access! Pbm déclaration application Excel
Plus de sujets relatifs à : Persistance déclaration statique


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR