Persistance déclaration statique

Persistance déclaration statique - C - Programmation

Marsh Posté le 18-01-2011 à 18:18:03    


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 !

Reply

Marsh Posté le 18-01-2011 à 18:18:03   

Reply

Marsh Posté le 18-01-2011 à 18:46:29    

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
Reply

Marsh Posté le 18-01-2011 à 18:46:43    

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).

Reply

Marsh Posté le 18-01-2011 à 18:55:49    

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.

Reply

Sujets relatifs:

Leave a Replay

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