Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

pointeur:utiliser une variable hors de sa portée

7 réponses
Avatar
zydraf
bonjour,

Je suis d=E9butant en C et j'ai vu l'int=E9r=EAt des pointeurs =E9tait,entr=
e
autre,de pouvoir utiliser l'objet(variable,fonction,...) vers lequel
ils pointent hors de la port=E9e de la fonction o=F9 il a =E9t=E9 d=E9fini.
Peut-on m'=E9crire la juste syntaxe pour illustrer ceci?

merci.

7 réponses

Avatar
Richard Delorme
Le 24/01/2010 18:09, zydraf a écrit :
bonjour,

Je suis débutant en C et j'ai vu l'intérêt des pointeurs était,entre
autre,de pouvoir utiliser l'objet(variable,fonction,...) vers lequel
ils pointent hors de la portée de la fonction où il a été défini.
Peut-on m'écrire la juste syntaxe pour illustrer ceci?



Je ne sais pas ce que vous voulez-dire, mais ceci est illégal :

//-----------8<-----------------------------
#include <stdio.h>

char *f()
{
char string[] = "bonjour";

return string;
}

int main(void)
{
printf("%sn", f());
}
-----------8<-----------------------------

Par contre ceci est ok:

//-----------8<-----------------------------
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char *g()
{
char string[] = "bonjour";
int l = strlen(string);
char *s = malloc(l + 1);
memcpy(s, string, l + 1);

return s;
}

int main(void)
{
char *z = g();
printf("%sn", z);
free(z);

return 0;
}
//---------8<---------------------------------

--
Richard
Avatar
Benoit Izac
Bonjour,

le 24/01/2010 à 18:09, zydraf a écrit dans le message
:

Je suis débutant en C et j'ai vu l'intérêt des pointeurs était,entre
autre,de pouvoir utiliser l'objet(variable,fonction,...) vers lequel
ils pointent hors de la portée de la fonction où il a été défini.
Peut-on m'écrire la juste syntaxe pour illustrer ceci?



#include <stdio.h>

void f1(int);
void f2(int *);

int
main(void)
{
int a = 1;

printf("a vaut : %dn", a);
f1(a);
printf("après f1(a), a vaut : %dn", a);
f2(&a);
printf("après f2(a), a vaut : %dn", a);

return 0;
}

void
f1(int n)
{
n++;
}

void
f2(int *n)
{
(*n)++;
}


--
Benoit Izac
Avatar
Matt...
Bonsoir,

Richard Delorme a écrit :
Je ne sais pas ce que vous voulez-dire, mais ceci est illégal :



Si les flics te choque en train de le faire, tu vas au trou illico presto...

Matt...
Avatar
Richard Delorme
Le 24/01/2010 19:23, Matt... a écrit :
Bonsoir,

Richard Delorme a écrit :
Je ne sais pas ce que vous voulez-dire, mais ceci est illégal :



Si les flics te choque en train de le faire, tu vas au trou illico
presto...




Si seulement c'était vrai...

--
Richard
Avatar
espie
In article ,
zydraf wrote:
bonjour,

Je suis débutant en C et j'ai vu l'intérêt des pointeurs était,entre
autre,de pouvoir utiliser l'objet(variable,fonction,...) vers lequel
ils pointent hors de la portée de la fonction où il a été défini.



Oui, entre autres. Ca necessite de faire une distinction entre portee et
duree de vie, qui sont deux notions differentes.
Peut-on m'écrire la juste syntaxe pour illustrer ceci?



Par exemple, tu as parfaitement le droit de faire ceci:


void f(int *t)
{

/* faire des trucs avec t */

}


void g()
{
int k[50];
f(k);
}

ce qui te permet d'acceder aux valeurs stockees dans k depuis f, en toute
legalite, puisque l'espace memoire correspondant a k est valide pendant
toute la duree de l'appel de f.

Par contre, du code tel que:

int *h()
{
int z = 42;
return &z;
}

est illegal, puisque z finit d'exister a la fin de l'execution de h.

On peut passer outre en utilisant static:

int *h2()
{
static int z = 42;
return &z;
}

mais ca presente peu d'interet le plus souvent, parce qu'on a alors une
seule variable z quel que soit l'appel de h2 concerne...

Ca marche donc mieux avec de l'allocation dynamique:

int *h3()
{
int *p = malloc(sizeof(int));
/* ici verifier que p != 0 */
*p = 42;
return p;
}

ou alors, en faisant les choses "a l'envers: allouer l'espace/gerer la
memoire dans l'appelant, et prendre un pointeur en parametre:

void h3(int *p)
{
*p = 42;
}

qui s'appellera par exemple avec:

int i;
h3(&i);




Voila. Dans mon experience, le point-cle, c'est cette distinction: duree de
vie/portee. Si tu comprends ca, la suite, ben c'est juste trouver les
idiomes qui fonctionnent, et se mefier des autres...
Avatar
Samuel Devulder
zydraf a écrit :
bonjour,

Je suis débutant en C et j'ai vu l'intérêt des pointeurs était,entre
autre,de pouvoir utiliser l'objet(variable,fonction,...) vers lequel
ils pointent hors de la portée de la fonction où il a été défini.
Peut-on m'écrire la juste syntaxe pour illustrer ceci?



C'est pas tellement la portée "syntaxique" (le scope pour les
anglophiles) qui compte que la durée de vie de l'espace mémoire que
représente ta variable. Le pointeur contient l'adresse de cet espace
mémoire et tant que l'espace mémoire est valide, tu peux y accéder, et
cela de toute les façons que tu veux: utilisation de la variable
d'origine, ou utilisation d'un pointeur sur cette zone mémoire.

La vraie question a te poser est donc: quelle est la durée de vie de
l'espace mémoire pointé?

Une variable locale "auto" représente un espace mémoire qui n'est
valable que tant qu'on a pas quitté le bloc dans lequel elle a été
déclarée. Une variable globale (i.e. déclarée en dehors de tout bloc) ou
une locale "static" représente un espace mémoire qui dure le temps de
l'exécution de ton programme, donc tu peux y accéder quand tu veux.
Enfin une zone mémoire allouée dans le tas via malloc() (et ses amies),
est valable tant qu'on a pas appelé free() dessus.

Avec ceci bien en tête tu devrais te faire une idée assez exacte de la
durée de validité d'un pointeur dans l'une de ces zones mémoires.

sam.
Avatar
-ed-
On 24 jan, 18:09, zydraf wrote:
Je suis débutant en C et j'ai vu l'intérêt des pointeurs était,en tre
autre,de pouvoir utiliser l'objet(variable,fonction,...) vers lequel
ils pointent hors de la portée de la fonction où il a été défin i.
Peut-on m'écrire la juste syntaxe pour illustrer ceci?

merci.



#include <stdio.h>

int *f(void)
{
static int S_count = 0;

return &S_count;
}

int main (void)
{
int *pi = f();

(*pi)++;

printf ("*pi = %dn", *pi);
return 0;
}

mais ce genre de pratique est déconseillée (les variables statiques
modifiables sont une plaie ...)