Quelle est la différence entre un tableau malloc et un tableau normal lorsque, dans les deux cas, je dois spécifier la taille de la mémoire?

Quelle est la différence entre un tableau malloc() et un tableau normal lorsque, dans les deux cas, je dois spécifier la taille de la mémoire, par exemple

 char* arr = malloc(50 * sizeof(char)) 

contre

 int arr [50] 

Eh bien, il y a trop de différences. Pour commencer, découvrez que les tableaux ne sont pas des pointeurs, et inversement .

Cela dit, trois différences majeures du sharepoint vue de la convivialité ( qui, à mon avis, vous intéressent )

  • Un tableau a une étendue limitée à son bloc englobant, mais les mémoires allouées dynamicment sont actives à moins d’être désallouées manuellement. Ainsi, les tableaux locaux d’une fonction ne peuvent pas être retrun mais un pointeur, renvoyé via malloc() -ing, peut l’être.

  • Pour les cas autres que VLA , la taille du tableau doit être une constante de temps de compilation, mais pour malloc() taille est spécifiée à l’exécution. En d’autres termes, pour les tableaux, vous devez connaître la taille au moment de la compilation, tandis que pour malloc() -ing, il est parfaitement possible de déterminer la taille demandée au moment de l’exécution.

  • Les tableaux ne peuvent pas être redimensionnés. Une fois définis, ils utilisent toute la mémoire requirejse pour leur taille. OTOH, un pointeur marqué par malloc() , pointant vers une certaine quantité de mémoire, peut très bien être realloc() avec une autre quantité de mémoire, si nécessaire.

La principale différence est que la mémoire allouée dynamicment peut être redimensionnée si nécessaire. Les tableaux (statiques, automatiques ou de longueur variable) ne peuvent pas être redimensionnés une fois instanciés.

Une différence secondaire a à voir avec la durée de vie du tableau. Les tableaux déclarés à l’étendue du fichier ou avec le mot clé static ont une durée de vie qui s’étend sur la durée de vie du programme. Les tableaux déclarés dans une fonction ou un bloc sans le mot clé static ont une durée de vie limitée à l’étendue de leur scope (raison pour laquelle vous ne pouvez pas renvoyer un pointeur sur un tableau local à partir d’une fonction – le tableau cesse d’exister lorsque la fonction sorties).

La mémoire dynamic se situe quelque part entre – sa durée de vie va de l’appel *alloc initial à l’appel free , qui peut avoir différentes fonctions. Vous contrôlez sa durée de vie directement.

En raison de la façon dont la mémoire est souvent gérée pour les variables auto (locales), les tableaux automatiques et de longueur variable ne peuvent souvent pas être arbitrairement volumineux. Toute tentative de création d’un tableau local d’une taille supérieure à un mégaoctet ou plus peut entraîner une erreur d’exécution. plates-formes populaires. Vous n’avez généralement pas de telles limites sur la mémoire allouée dynamicment.

Parce que la taille du tableau doit être disponible au moment de la compilation, l’utilisation du pointeur vous permet de déterminer sa taille au moment de l’exécution.

De ce lien :

L’allocation dynamic de mémoire permet à votre programme d’obtenir plus d’espace mémoire en cours d’exécution ou de le libérer s’il n’est pas nécessaire.

En termes simples, l’allocation dynamic de mémoire vous permet de gérer manuellement l’espace mémoire de votre programme.

Vous pouvez également lire ici que, dans l’allocation statique, la mémoire requirejse est allouée par le compilateur et que la taille et le type de stockage exacts doivent être connus au moment de la compilation. D’autre part, dans l’allocation de mémoire dynamic, la mémoire allouée “à la volée” pendant l’exécution et l’espace alloué de manière dynamic est généralement placée dans un segment de programme appelé tas ou magasin libre.

Avec le malloc la taille que vous utilisez peut être une variable! Cela signifie que la taille peut changer en fonction de la modification de la variable avant que l’exécution n’atteigne l’instruction malloc . Spécifier la taille d’un tableau déclaré doit sinon être constant.

 int foo = 5; char bar[foo]; // This will cause a comstack error char bar[5]; // size is fixed, array size specifiers MUST be constant in C void some_func (void) { // do some work that might change foo, eg get a value from user char* arr = malloc(foo * sizeof(char)); //foo is variable, thus the size is variable! } 

Notez que vous avez dit que vous malloc pour créer un tableau. Ceci est une erreur. malloc alloue simplement une mémoire contiguë et vous indique le début de cette mémoire – techniquement, il ne s’agit pas d’un tableau (il peut être utilisé comme s’il s’agissait de plusieurs circonstances, mais pas de toutes les circonstances)