L'allocation de mémoire C dans un peu de problème intéressant (le jardin blog original article déjà publié ne peut pas être réutilisé démarquage d'écrire de cette façon)

L'environnement de test de code suivant: vs2019

Pour poser des questions

La mise en œuvre du code un tel, et voir ce qui se passe:

int arr[5] = { 0 };
int main()
{
    arr[5] = 1;
}

Il ne fait aucun doute, je me plaindre, parce que la violation d'accès.


Regardez un autre morceau de code:

int arr[5] = { 0 };
int main()
{
    arr[5] = 1;
}

Presque pas de différence par rapport au code ci-dessus, seule la définition arr et la fonction d'initialisation déplacée à l'extérieur, mais l'exécution du programme sans erreur.

Il y a tellement de pièces similaires de code:

int main()
{
    static int arr[5] = { 0 };
    arr[5] = 1;
}

La même chose peut être exécuté avec succès, alors c'est pourquoi?


explorer les questions

L'extrait suivant

Dans C++la mémoire est divisée en cinq domaines, à savoir le tas , pile , magasin gratuit , la mémoire globale / statique et une zone de mémoire constante .
Heap : tas est le système d'exploitation à long terme, le système d'exploitation est maintenu par une mémoire spéciale, l' allocation dynamique de la mémoire pour le programme de Clangue à mallocpartir de la mémoire allouée sur le tas en utilisant freela sortie de la mémoire correspondant alloué.
Stack : au cours d' une fonction, la fonction de boîte de cellules de mémoire dans une variable locale pile créée sur les cellules de mémoire libérée automatiquement à la fin de l'exécution de la fonction. Stack opération d'allocation de mémoire dans le jeu d'instructions du processeur, une efficacité élevée, mais la quantité limitée de mémoire allouée.
magasin gratuit : espace de stockage gratuit est C++basé sur newun concept abstrait de l'opérateur, qui , par l' newapplication mémoire opérateur, la mémoire est le magasin libre .
zone de stockage global / statique : cette mémoire est dans le temps de compilation des programmes déjà alloués, sont présents tout au long du déroulement du programme. Tels que les variables globales , variables statiques .
zone de stockage constante: Ceci est une zone de stockage spéciale à l' intérieur du magasin , ils sont 常量(const)pas autorisés à modifier.

Les questions ci - dessus concernent deux domaines: la pile et la zone de stockage global / statique .


spéculation personnelle

Sur la base de ces résultats, j'ai un peu la spéculation prématurée:

  • Stack espace est une bonne répartition du système prédéterminé, si I est définie int arr[5], le système donnera (système 32 bits) I 5 * 4 octets d'espace, le système ne permet pas moi d'accéder aux données en cas de dépassement de l'espace d'adressage.
  • Global / zone de stockage statique est différent, quand je défini int arr[5], le système retourne pour moi arrla première adresse , non seulement j'eu accès à 20 octets de contenu selon la première adresse, vous pouvez également accès au contenu en dehors de vingt octets.

Je suppose que tu aimes

Origine www.cnblogs.com/XiaoXiaoShuai-/p/12452795.html
conseillé
Classement