GNT sans publicité, site mobile, fonctionnalitées exclusives...

adresse d'une variable d'environnement

Le
Kevin Denis
Bonjour,

je suis sur un système linux x86 32bits.
J'ai des variables d'environnements, et depuis un programme C, je
souhaite connaitre leurs adresses.
Typiquement:
MAVAR="blablable()blablbabla"
export MAVAR

Si je regarde le man, je vois que la fonction getenv à l'air de
faire l'affaire. getenv renvoie un pointeur, et il est de type:
#include <stdlib.h>
char *getenv (const char *name);

J'écris donc:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void){
char *p = NULL; //je vais utiliser un pointeur
p = getenv('MAVAR'); //getenv me renvoie un pointeur
printf('Adresse de MAVAR: %p', p); //j'affiche le pointeur
return 0; //comme ça gcc râle moins
}

sauf que ça ne fonctionne pas
J'ai lors de la compilation des warning:
warning: multi-character character constant
et
warning: passing arg 1 of `getenv' makes pointer from integer without a cast

et au lancement le programme ne fait rien d'autre qu'un segfault.

Un conseil pour me montrer ce que je fais mal?
Merci
--
Kevin
Lire les 23 réponses

Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses Page 1 / 5
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Xavier Roche
Le #23673671
Le 22/08/2011 15:39, Kevin Denis a écrit :
p = getenv('MAVAR'); //getenv me renvoie un pointeur



p = getenv("MAVAR"); /* getenv me renvoie un pointeur */

Les '' sont réservés en C aux char ('a') [éventuellement aux versions
sur 2 ou 4 octets, mais c'est hors-sujet ici] et non aux chaînes.
Éric Lévénez
Le #23674001
Le 22/08/11 15:50, Xavier Roche a écrit :
Le 22/08/2011 15:39, Kevin Denis a écrit :
p = getenv('MAVAR'); //getenv me renvoie un pointeur



p = getenv("MAVAR"); /* getenv me renvoie un pointeur */

Les '' sont réservés en C aux char ('a') [éventuellement aux versions
sur 2 ou 4 octets, mais c'est hors-sujet ici] et non aux chaînes.



Et idem pour le printf, auquel en plus il manque en plus le n.

Mais sinon vouloir connaître l'adresse d'une variable d'environnement en
C, laisse supposer que pour toi (Kevin) cette variable est la même que
sous shell. Ceci n'est pas vrai. Chaque programme a son propre espace
mémoire virtuel, et les variables shell sont passées par valeur et non
par adresse.

--
Éric Lévénez
FAQ de fclc :
Xavier Roche
Le #23673991
Le 22/08/2011 17:38, Éric Lévénez a écrit :
Mais sinon vouloir connaître l'adresse d'une variable d'environnement en
C, laisse supposer que pour toi (Kevin) cette variable est la même que
sous shell.



C'est du reste le même comportement que lorsque l'on exporte une
variable ("export") dans un script: une fois terminé le script,
l'appelant (en général le shell) ne "verra" pas cette modification qui
était interne au script.
Pascal J. Bourguignon
Le #23674091
Xavier Roche
Le 22/08/2011 17:38, Éric Lévénez a écrit :
Mais sinon vouloir connaître l'adresse d'une variable d'environnement en
C, laisse supposer que pour toi (Kevin) cette variable est la même que
sous shell.



C'est du reste le même comportement que lorsque l'on exporte une
variable ("export") dans un script: une fois terminé le script,
l'appelant (en général le shell) ne "verra" pas cette modification qui
était interne au script.



C'est pire. Je ne me souviens pas avoir vu aucune garantie dans la
norme POSIX telle que: getenv("V")==(f(),getenv("V")).
Donc l'intérêt d'obtenir cette adresse est nul.

Le standard énonce explicitely:

The string pointed to may be overwritten by a subsequent call to
getenv(), [CX] [Option Start] setenv(), or unsetenv(), [Option End]
but shall not be overwritten by a call to any other function in
this volume of IEEE Std 1003.1-2001.


--
__Pascal Bourguignon__ http://www.informatimago.com/
A bad day in () is better than a good day in {}.
Xavier Roche
Le #23674371
Le 22/08/2011 18:13, Pascal J. Bourguignon a écrit :
C'est pire. Je ne me souviens pas avoir vu aucune garantie dans la
norme POSIX telle que: getenv("V")==(f(),getenv("V")).



C'est du reste il me semble ce qui se passe sous Windows (bon, certes,
pas POSIX pour un sou, mais passons), où getenv() renvoi un tableau
calculé à partir de la "vrai" version (qui est notamment codée sur des
caractères 16-bit) en mode Unicode.
Publicité
Suivre les réponses
Poster une réponse
Anonyme