web-dev-qa-db-fra.com

Pourquoi ai-je besoin d'une allocation de mémoire dynamique si je peux simplement créer un tableau?

J'étais en train de lire sur l'allocation de mémoire dynamique et l'allocation de mémoire statique.

Dans les programmes décrits dans les chapitres précédents, tous les besoins en mémoire ont été déterminés avant l’exécution du programme en définissant les variables nécessaires. Cependant, il peut arriver que les besoins en mémoire d'un programme ne puissent être déterminés que pendant l'exécution. Par exemple, lorsque la mémoire nécessaire dépend des entrées de l'utilisateur.

J'ai donc écrit le programme suivant en C++:

#include <iostream>

int main()
{
  int n = 0;
  int i = 0;

  std::cout << "Enter size: ";
  std::cin >> n;
  int vector[n];

  for (i=0; i<n; i++)
  {
    vector[i] = i;
  }

  return 0;
}

Ce programme fonctionne . Je ne comprends pas comment cela fonctionne Quand la taille est-elle déterminée ici? Comment le vecteur est-il alloué dans ce cas?

6
Vasi Marin

Selon ceci (souligné par moi):

Les tableaux automatiques de longueur variable sont autorisés dans ISO C99 et en tant que extension GCC les accepte en mode C90 et en C++. Ces tableaux sont déclarée comme n'importe quel autre tableau automatique, mais avec une longueur qui est pas une expression constante. La mémoire est allouée au point de déclaration et désalloué lorsque la portée du bloc contenant le fichier déclaration exits.

Notez que ceci est juste une extension et ne fonctionnera pas sur tous les compilateurs, par exemple, cela ne fonctionne pas pour moi dans MSVC (j'obtiens l'erreur "expression doit avoir une valeur constante").

8
Blaze

Un autre élément important des documents gcc:

Vous pouvez utiliser la fonction alloca pour obtenir un effet très similaire à tableaux de longueur variable. La fonction alloca est disponible dans beaucoup d'autres C implémentations (mais pas dans toutes). D'autre part, de longueur variable les tableaux sont plus élégants.

Il existe d'autres différences entre ces deux méthodes. Espace alloué avec alloca existe jusqu'au retour de la fonction contenant. L'espace pour un tableau de longueur variable, est désalloué dès que le nom du tableau est la portée se termine. (Si vous utilisez à la fois des tableaux de longueur variable et alloca dans la même fonction , La désallocation d'un tableau de longueur variable aura également pour effet de.

alloca - alloue de la mémoire libérée automatiquement. Le La fonction alloca () alloue des octets de taille dans le cadre de la pile de l'appelant. Cet espace temporaire est automatiquement libéré lorsque le fichier La fonction appelée alloca () retourne à son appelant. Le alloca () la fonction dépend de de la machine et du compilateur. C'est sûr applications, son utilisation peut améliorer l'efficacité par rapport à l'utilisation de malloc (3) plus libre (3).

Donc, pour vous, je pense, les mêmes affirmations que pour alloca s'appliquent:

Il n'y a aucune indication d'erreur si le cadre de la pile ne peut pas être étendu . (Cependant, après une affectation échouée, le programme est susceptible de recevoir Un signal SIGSEGV s'il tente d'accéder à l'espace non alloué.)

l'utilisation de l'allocation dynamique de mémoire est plus sûre que les tableaux de longueur variable.

0
Dmytro Dadyka