7 votes

Le champ d'application en C n'est-il lié qu'au moment de la compilation, puisque nous savons que nous pouvons accéder à n'importe quelle mémoire au moment de l'exécution ?

J'essayais de comprendre la signification exacte de la portée en C. Ce que j'ai pu comprendre, c'est que la portée est limitée au temps de compilation uniquement. Par exemple, si vous accédez à une variable locale à partir d'une autre fonction. Cela entraînera une erreur de compilation. D'un autre côté, le programme suivant fonctionne bien. Cela signifie que le C a un modèle de mémoire plat et que l'on peut accéder à tout au moment de l'exécution. Les livres de C associent le champ d'application à la durée de vie et à la visibilité des variables, je trouve cela assez déroutant. Je pense que tous ces termes n'ont de sens qu'au moment de la compilation. Quelqu'un peut-il m'éclairer à ce sujet ?

#include "stdio.h"

int *ptr;

int func(void)
{
  /** abc is a local variable **/
  int abc = 132;
  ptr = &abc;
  return 0;
}

int func1(void)
{

  /** although scope of abc is over still I can change the value in the address  of abc **/
  *ptr = 200;
  printf("the value of abc=%d\r\n",*ptr);

}

int main(void)
{
   func();
   func1();
   return 0;
}

Résultats : la valeur de abc =200

En termes plus simples, qu'entend-on par portée ? Intervient-elle au moment de l'exécution ou de la compilation ? Comme nous pouvons le constater, nous pouvons accéder à tout au moment de l'exécution. Mais, si nous ne respectons pas les règles, nous obtiendrons une erreur de compilation. Par exemple, la référence à une variable locale dans une autre fonction. Le compilateur lancera une erreur disant "variable non définie...".

Puis-je dire la chose suivante à propos des variables ?

1) Scope attribute comes under compile time.
2) Lifetime attribute comes under run-time.
3) Visibility attribute comes under compile-time

0voto

Shafik Yaghmour Points 42198

Portée est une propriété du temps de compilation et traite du moment où la référence à une variable est valide ou lorsqu'elle est visible, ce qui est différent de la propriété storage duration ou durée de vie d'un objet qui indique quand il est valable d'accéder à la mémoire associée à la variable.

Dans ce cas abc a une durée de stockage automatique, ce qui signifie que sa durée s'étend au bloc dans lequel il se trouve, qui dans ce cas est la fonction func et tentant d'accéder à la mémoire associée à abc à l'extérieur de ce bloc est comportement indéfini Il peut sembler fonctionner, mais on ne peut pas se fier aux résultats.

Extrait de la section du projet de norme C99 6.2.4 Durée de stockage des objets paragraphe parle des différentes durées de stockage : static y automatic . En explique qu'un static La durée de vie des variables correspond à l'exécution entière du programme et en paragraphe 5 il est dit :

Pour un tel objet qui n'a pas un type de tableau à longueur variable, sa durée de vie s'étend depuis l'entrée dans le bloc auquel il est associé jusqu'à la fin de l'exécution de ce bloc, de quelque manière que ce soit. de quelque manière que ce soit. [..]

Ainsi, une variable automatique de vie est le bloc dans lequel elle est contenue et paragraphe 2 dit :

La durée de vie d'un objet est la partie de l'exécution du programme pendant laquelle le stockage est pendant laquelle il est garanti qu'un espace de stockage lui sera réservé. Un objet existe, a une adresse constante,25) et conserve les informations suivantes sa dernière valeur stockée pendant toute sa durée de vie.26) Si un objet est référencé en dehors de sa durée de vie, le comportement est indéterminé. La valeur d'un pointeur devient indéterminée lorsque l'objet vers lequel il pointe atteint la fin de sa durée de vie.

Ainsi, faire référence à un objet en dehors de sa durée de vie garantie est un comportement non défini.

0voto

ColdCat Points 599

C'est indéfini et vous ne devriez pas vous fier à la valeur. Avec de petits changements sur votre code (MSVC 2013) il y a une surprise.

int func1()
{   
    /** although scope of abc is over still I can change the value in the address  of abc **/
    printf("the value of abc=%d\r\n", *ptr);
    *ptr = 200;
    printf("the value of abc=%d\r\n", *ptr);
    return 0;
}

int main()
{
    func();
    printf("the value of abc=%d\r\n", *ptr);
    func1();
}

la sortie est sur mon ordinateur.

la valeur de abc=132
la valeur de abc=1519668
la valeur de abc=200

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X