7
votes

Allocation de mémoire dynamique sur la pile

J'ai récemment essayé cette expérience dans laquelle au lieu d'aller pour une allocation de mémoire dynamique pour les exigences de mémoire de la taille inconnue, j'ai fait une allocation statique. Lorsqu'un tableau A [i] code> a été déclaré par moi, j'ai conservé i code> (taille de la matrice) et dépend de l'entrée que l'utilisateur donne.

 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <conio.h>
 void function(int );
 int main(void)
 {
     int i;
     printf("Enter:");
     scanf("%d",&i);
     function(i);
     printf("i = %d\n",i);
     getch();
     return 0;
 }
 void function(int i)
 {
      char a[i];
      char b[4];
      strncpy(a,"hello",i);
      strcpy(b,"world");
      int j = 0;
      char *c = a;
      for( j = 0; j< 20; j++ )
           printf("%c",*c++);
 }
  • est une telle opération légale? LI>
  • Si non, pourquoi le compilateur ne émet aucun avertissement ou une erreur? LI>
  • Où cette mémoire sera-t-elle allouée: pile ou tas? Li>
  • Pourquoi ANSI C / GCC permet-il cela? LI> ul> p>


1 commentaires

Quelles options avez-vous utilisées pour compiler cela? Qu'avez-vous vu quand vous avez couru cela? Vous devriez essayer d'imprimer la chaîne le pointeur C pointe sur.


6 Réponses :


1
votes

Ceci est légal, mais tous les compilateurs ne le soutiennent pas. Au moins Visual Studio <= 2003 AFAIK ne le supporte pas.

Je suppose que ce n'était pas Ansi C ++, essayez de GCC -ansi -peantic.


0 commentaires


0
votes

Les matrices de longueur variable sont illégales dans ANSI C (C89). Essayez de monter le niveau d'avertissement de votre compilateur et je suis sûr que vous obtiendrez un avertissement / une erreur.


0 commentaires

16
votes

est une telle opération légale?

C'est ce qu'on appelle une matrice de longueur variable.

VLAS est légal dans ANSI C99 et comme extension à certains compilateurs de Pre-C99. GCC le supporte à la fois comme strict C99 et comme extension du code non-C99. C'est aussi légal en C ++ 0x.

Si non, pourquoi le compilateur n'est-il pas émettre d'avertissement ou d'erreur?

avec GCC: xxx

La présence de "conio.h" de MSDOS indique que vous utilisez probablement un compilateur Microsoft Visual C ++, donc Don ' t vous soucier de ça. MS a travaillé pour rendre leur compilateur plus conforme à la norme C ++ 0X, mais ne fait aucune allégation sur la manière dont le mode STORN STI ST Compiler est. Vous demandez pourquoi les mots de dialecte espagnol ne sont pas dans le dictionnaire français.

Où cette mémoire sera-t-elle allouée: pile ou tas?

C'est un objet automatique, la plupart des implémentations C mettront la pile pour des raisons d'efficacité.

Pourquoi ANSI C / GCC permet à cette

Il est utile de créer des matrices temporaires de taille variable au moment de l'exécution dont la durée de vie n'apparaît pas au-delà de l'appel de la fonction.


2 commentaires

ISO C99 a été adopté par ANSI en 2000 - il n'existe pas d'ANSI C99


Il n'y a "rien de tel" que l'ISO C99 soit - cela s'appelle ISO / CEI 9899: 1999. ANSI C99 est la version de C normalisée en 1999, communément appelée C99, adoptée par ANSI.



0
votes

Le code est valide, mais il y a une chose à garder à l'esprit lorsque vous utilisez des tableaux de longueur variable.

void function(int i)
{
     int a[i];
     .
     .
}


0 commentaires