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

déclaration variable en static dans une fonction

75 réponses
Avatar
Pascal
Bonjour,

J'ai le code suivant

void fct(void)
{

static int toto;

toto=toto+1;
.....
}

Que signifie le fait que toto soit déclaré en static? Quel est l'utilité?

Dans cette fonction j'ai l'impression que toto à chaque appel garde la
valeur précédente. c'est à dire qu'au 1er appel de fct il vaut 1 au 2eme
appel il vaut 2 etc...????

Merci pour vos explications

10 réponses

1 2 3 4 5
Avatar
fabrizio
Que signifie le fait que toto soit déclaré en static? Quel est l'utilité?

Dans cette fonction j'ai l'impression que toto à chaque appel garde la
valeur précédente. c'est à dire qu'au 1er appel de fct il vaut 1 au 2eme
appel il vaut 2 etc...????


C'est exactement ça : la valeur est conservé d'un appel à l'autre.
De plus il est allouée dans la zone statique et non sur la pile comme
les variables automatiques.

Avatar
Pascal
Merci :)


"fabrizio" a écrit dans le message de
news:d4akk3$odm$
Que signifie le fait que toto soit déclaré en static? Quel est
l'utilité?



Dans cette fonction j'ai l'impression que toto à chaque appel garde la
valeur précédente. c'est à dire qu'au 1er appel de fct il vaut 1 au 2eme
appel il vaut 2 etc...????


C'est exactement ça : la valeur est conservé d'un appel à l'autre.
De plus il est allouée dans la zone statique et non sur la pile comme
les variables automatiques.



Avatar
Pierre Maurette
Bonjour,

J'ai le code suivant

void fct(void)
{

static int toto;

toto=toto+1;
.....
}

Que signifie le fait que toto soit déclaré en static? Quel est l'utilité?
Utilité principale: quand on poste un code avec ce genre de truc, on

est sûr d'avoir en fin de journée un petit mot gentil de la part
d'Emmanuel (et ce n'est pas un UB, c'est garanti par la norme).

Dans cette fonction j'ai l'impression que toto à chaque appel garde la
valeur précédente. c'est à dire qu'au 1er appel de fct il vaut 1 au 2eme
appel il vaut 2 etc...????
C'est celà. Je les vois comme des globales dont l'accès et la

visibilité est réduite par le compilateur au corps à la fonction.
Comme des globales, si elles ne sont pas initialisées explicitement,
elles le sont à 0, lors du premier appel de la fonction (en fait, je
suppose que c'est avant). Mais comme 0 n'est ici qu'une valeur
particulière, je préfère écrire:
static int toto = 0;
sachant que cette initialisation n'aura lieu qu'une fois.
Ça peut être utile, ou amusant:

void test(int i)
{
#ifdef _DEBUG
static int nbAppels = 0;
static int nbInsts = 0;
#endif
/* ... */

#ifdef _DEBUG
printf("Appel %d de la fonction test, "ouverte" %d fois, i vaut:
%dn", ++nbAppels, ++nbInsts, i);
#endif

/* ... */

while(i > 0)test(--i);


#ifdef _DEBUG
if(--nbInsts == 0)printf("Fin du poteau...n");
#endif
return;
}

int main(void)
{
int i;
for(i = 0; i < 6; i++)test(i);
/* etc. */

--
Pierre

Avatar
Emmanuel Delahaye
Pierre Maurette wrote on 22/04/05 :
C'est celà. Je les vois comme des globales dont l'accès et la visibilité est
réduite par le compilateur au corps à la fonction.


Une globale a accès limité ? On aura tout vu... Tu confonds les notions
de portée et de persistence...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Clearly your code does not meet the original spec."
"You are sentenced to 30 lashes with a wet noodle."
-- Jerry Coffin in a.l.c.c++

Avatar
Emmanuel Delahaye
(supersedes )

Pierre Maurette wrote on 22/04/05 :
C'est celà. Je les vois comme des globales dont l'accès et la visibilité
est réduite par le compilateur au corps à la fonction.


Une globale a visibilité limitée ? On aura tout vu... Tu confonds les
notions de portée et de persistence...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"Clearly your code does not meet the original spec."
"You are sentenced to 30 lashes with a wet noodle."
-- Jerry Coffin in a.l.c.c++

Avatar
Pierre Maurette
(supersedes )

Pierre Maurette wrote on 22/04/05 :
C'est celà. Je les vois comme des globales dont l'accès et la visibilité
est réduite par le compilateur au corps à la fonction.


Une globale a visibilité limitée ? On aura tout vu... Tu confonds les notions
de portée et de persistence...
Bonsoir, Emmanuel. La semaine fut bonne ?

Pour le reste, je vous rassure, non, je ne confonds pas. La route est
encore longue vers le nirvana de l'expertise, mais quand même.
Pour l'instant, je continue à trouver qu'une statique est "très proche"
d'une globale, et "très différente" d'une automatique.
Pour rester dans la joie et la bonne humeur:

int* test(void)
{
static int a = 12;
printf("%dn", a);
return &a;
}

int main(void)
{
int* rigolo = test();
*rigolo = 10;
test();
*rigolo = 20;
test();
/* etc. */

--
Pierre


Avatar
Emmanuel Delahaye
Pierre Maurette wrote on 22/04/05 :
C'est celà. Je les vois comme des globales dont l'accès et la visibilité
est réduite par le compilateur au corps à la fonction.


Une globale a visibilité limitée ? On aura tout vu... Tu confonds les
notions de portée et de persistence...


Pour le reste, je vous rassure, non, je ne confonds pas. La route est encore
longue vers le nirvana de l'expertise, mais quand même.
Pour l'instant, je continue à trouver qu'une statique est "très proche" d'une
globale, et "très différente" d'une automatique.


Tu peux trouver ce que tu veux, les faits sont contre toi...

- Une variable persistante de portée globale (avec ou sans lien
externe) est une globale
- Une variable persistante de portée locale (bloc) n'est pas une
globale. C'est une variable persistante. Du genre de celles qui rendent
certaines fonctions de bibliothèques non utilisables partout (genre
strtok(), par exemple)...

--
Emmanuel
The C-FAQ: http://www.eskimo.com/~scs/C-faq/faq.html
The C-library: http://www.dinkumware.com/refxc.html

"There are 10 types of people in the world today;
those that understand binary, and those that dont."



Avatar
Pierre Maurette
Pierre Maurette wrote on 22/04/05 :
C'est celà. Je les vois comme des globales dont l'accès et la visibilité
est réduite par le compilateur au corps à la fonction.


Une globale a visibilité limitée ? On aura tout vu... Tu confonds les
notions de portée et de persistence...


Pour le reste, je vous rassure, non, je ne confonds pas. La route est
encore longue vers le nirvana de l'expertise, mais quand même.
Pour l'instant, je continue à trouver qu'une statique est "très proche"
d'une globale, et "très différente" d'une automatique.


Tu peux trouver ce que tu veux, les faits sont contre toi...
Le monde antillais (entier ? l'orthographe et moi ...) est contre moi.


- Une variable persistante de portée globale (avec ou sans lien externe) est
une globale
- Une variable persistante de portée locale (bloc) n'est pas une globale.
C'est une variable persistante.
Ce n'est pas bien éloigné de ce que j'écrivais. Dans une optique

pédagogique.

Du genre de celles qui rendent certaines
fonctions de bibliothèques non utilisables partout (genre strtok(), par
exemple)...
Il ne s'agit pas d'utiliser des statiques n'importe où. Et justement,

en se représentant une statique comme une globale à accès limité *par
le compilateur* (et avec quelques notions sur la réentrance, le
multitâche, etc.), on évite mieux ce genre d'erreur.

--
Pierre




Avatar
Richard Delorme
Pierre Maurette wrote on 22/04/05 :

C'est celà. Je les vois comme des globales dont l'accès et la
visibilité est réduite par le compilateur au corps à la fonction.



Une globale a visibilité limitée ? On aura tout vu... Tu confonds les
notions de portée et de persistence...




Pour le reste, je vous rassure, non, je ne confonds pas. La route est
encore longue vers le nirvana de l'expertise, mais quand même.
Pour l'instant, je continue à trouver qu'une statique est "très
proche" d'une globale, et "très différente" d'une automatique.



Tu peux trouver ce que tu veux, les faits sont contre toi...

- Une variable persistante de portée globale (avec ou sans lien externe)
est une globale
- Une variable persistante de portée locale (bloc) n'est pas une
globale. C'est une variable persistante. Du genre de celles qui rendent
certaines fonctions de bibliothèques non utilisables partout (genre
strtok(), par exemple)...


Une variable locale persistante, ou tout du moins l'objet quelle
représente, peut être accessible hors de sa portée :

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

int* f(void)
{
static int i = 42;
return &i;
}

int main(void)
{
printf("i = %dn", *f());
*f() = 8;
printf("i = %dn", *f());
return 0;
}
/*--------8<------------------*/

En fait, dans ce cas, la limitation de la portée ne concerne que le nom
de la variable.

--
Richard




Avatar
Thierry Boudet
On 2005-04-22, Emmanuel Delahaye wrote:
(supersedes )

Pierre Maurette wrote on 22/04/05 :
C'est celà. Je les vois comme des globales dont l'accès et la visibilité
est réduite par le compilateur au corps à la fonction.


Une globale a visibilité limitée ? On aura tout vu... Tu confonds les
notions de portée et de persistence...

Pourtant, j'ai trouvé cette vision assez pertinente, où est

mon erreur ?

--
_/°< coin


1 2 3 4 5