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
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 deC
langue àmalloc
partir de la mémoire allouée sur le tas en utilisantfree
la 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 estC++
basé surnew
un concept abstrait de l'opérateur, qui , par l'new
application 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 moiarr
la 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.