3
votes

L'accès à la valeur statique à l'aide d'une variable de pointeur global est-il valide?

Puis-je accéder à la variable statique en utilisant le pointeur global?

//In main.c file
static int c = 20; #Static vairble 
int *ptr = &c; #Global pointer variable
int main(){
  fun();
  printf("%d\n", c);
}

//In sub.c file
extern int *ptr;
void fun(){
  ++*ptr;
}

Lorsque j'ai essayé d'accéder à la variable globale * ptr en utilisant le mot-clé extern dans un autre fichier, je suis en mesure d'accéder à la variable statique la variable c et même les modifications apportées au * ptr se reflètent sur c dans le fichier main.c

  1. Pourquoi "ptr" ne perd-il pas sa propriété globale même après avoir été assignée par une adresse de variable statique?

  2. Est-ce que statique et global sont stockés dans deux segments de mémoire différents ou partagent-ils tous les deux le même segment de données de mémoire?

  3. Les variables globales peuvent-elles stocker des valeurs non constantes?


1 commentaires

Que fait réellement ++ * ptr ? Quelle indirection se produit?


4 Réponses :


3
votes

static ne consiste pas à placer l'objet dans une partie de la mémoire qui ne peut pas être modifiée / adressée à partir d'autres unités de traduction. Il s'agit simplement de définir que l'objet a un lien interne et ne peut donc pas être saisi par d'autres unités de traduction via ce nom (interne).

Mais si vous obtenez l'adresse mémoire d'un objet déclaré static dans une autre unité de traduction, vous pouvez légalement accéder à l'objet.

Donc, votre construction est valide. p>

On pourrait simplement obéir au "fiasco d'ordre d'initialisation statique" lorsque d'autres unités de traduction tirent des copies de votre ptr (probablement avant que cela ne soit pointé sur c ). Considérez, par exemple, ce qui peut arriver lorsqu'une autre unité de traduction contient au niveau du fichier ...

extern int *ptr;
int *myPtr = ptr;
...
int main() {
   int x = *myPtr;
}


0 commentaires

4
votes

Vous confondez la liaison d'une variable de pointeur et la liaison de ce qu'elle pointe .

La liaison d'un pointeur ne change pas , indépendamment de sur quoi il pointe.

Ici, le lien de ptr est global (aka externe ) et le lien de c est statique (aka interne ). Ni l'un ni l'autre ne modifie le lien de l'autre.

static signifie que c ne sera pas visible em> (c'est-à-dire disponible pour un lien direct) dans un autre fichier (par exemple) .c . Autrement dit, un autre .c ne pourrait pas faire:

#include <stdio.h>

static int c = 20; // Static vairble

int main(){
    int *ptr = &c;
    return 0;
}

Mais, il pourrait faire:

#include <stdio.h>

static int c = 20; // Static vairble
int *ptr;

int main(){
    ptr = &c;
    return 0;
}

Vous pourriez avoir l'inverse:

int c = 20;
static int ptr = &c;

Ceci est un statique / lien interne ptr pointant vers un lien global / externe c.

Un programme a plusieurs zones mémoire: .text pour code. .data pour les variables initialisées (telles que c ) et .bss pour unitialized

Puisque vous initialisez à la fois ptr et c , ils se retrouvent tous les deux dans .data code>

Si vous aviez fait:

int **ptr3 = &ptr;

Alors, c est initialisé et va dans .data mais ptr n'est pas initialisé mais est attribué et va dans le .bss code> segment

Toutes les variables [globales ou non] peuvent avoir des valeurs non constantes. Soit par initialisation, soit par affectation.

Toutes les variables ci-dessus ont global / file scope.

Voici un autre type de portée:

int *ptr2 = &c;

Ici, ptr a une portée function . Il est placé sur le cadre de pile de main . Il n'a aucun lien à proprement parler (c'est-à-dire qu'il n'apparaîtra jamais dans la table des symboles de l'exécutable).


1 commentaires

La portée n'est pas le problème. Les deux c et ptr ont une portée fichier (qui est le terme utilisé par le standard C, pas global ou statique). Le problème est le lien, qui est le processus par lequel le même identifiant dans différentes portées peut être amené à faire référence au même objet. c a une liaison interne . ptr a une liaison externe .



1
votes

Pourquoi "ptr" ne perd-il pas sa propriété globale même après son affectation par une adresse de variable statique?

Une variable ne peut pas "perdre" sa portée ou sa classe de stockage, le spécificateur de classe de liaison static détermine la visibilité du symbole, pas où ni comment il est stocké. Cela empêche les données d'être référencées via ce symbole , cela n'empêche pas les références de pointeur vers le même emplacement. C est un langage de niveau système - en tant que tel, il ne vous empêche pas de faire à peu près tout ce qui peut être fait au niveau de l'architecture.

Est-ce que statique et global sont stockés dans deux segments de mémoire différents ou ils partagent tous les deux le même segment de données de la mémoire?

Non. Le mot clé static est utilisé dans ce cas pour spécifier un lien statique ou ou interne , il est également utilisé (pour les variables locales de fonction) comme une classe de stockage spécificateur, mais toutes les variables en dehors d'une fonction ont une classe de stockage statique indépendamment du lien interne ou externe.

Cela dit, les données de stockage statiques initialisées sont placées dans une section de l'éditeur de liens différente de zéro ou des données non initialisées. Ceci est pour faciliter l'initialisation au démarrage de l'exécution.

Les variables globales peuvent-elles stocker des valeurs non constantes?

Cela mérite peut-être une question distincte pour expliquer pourquoi vous pourriez penser le contraire - cela ne semble pas lié à vos autres questions et à un champ de gauche. Dans votre propre exemple, ptr stocke & c , mais cela pourrait être modifié au moment de l'exécution pour pointer ailleurs.


0 commentaires

1
votes

Pourquoi "ptr" ne perd-il pas sa propriété globale même après son affectation par une adresse de variable statique?

ptr reste global quel que soit l'endroit où il pointe car il est déclaré global.

Est-ce que statique et global sont stockés dans deux segments de mémoire différents ou ils partagent tous les deux le même segment de données de la mémoire?

En général, ils résident dans le même segment de données.

https://www.geeksforgeeks.org/memory-layout- of-c-program /

Les variables globales peuvent-elles stocker des valeurs non constantes?

oui, comme toute autre variable, d'où le nom "variable"


0 commentaires