Tableau dynamique de l'allocation sur la pile en C
J'ai juste fait une expérience d'hier, et de trouver quelque chose de déroutant:
#include <stdio.h>
int main()
{
int j;
scanf("%d",&j);
const int i = j;
int arr[i];
return 0;
}
Le nombre j
est lu à partir du clavier, et il est utilisé pour allouer le tableau arr
sur la pile.
Le compilateur ne sait même pas la taille du tableau au moment de la compilation (initialise j à 0?), mais il n'y a pas d'erreur de compilation. Comment est-il possible?
En fait, vous devez expliquer pourquoi vous pensez que le compilateur doit donner une erreur
Recherche
je pense que vous avez été d'étudier c89 tout ce temps..
au passage, en passant par la variable supplémentaire
comme C11 tag a été ajouté, note que C11 introduit VLAs prise en charge.
Recherche
[c] VLA
dans ce site.je pense que vous avez été d'étudier c89 tout ce temps..
au passage, en passant par la variable supplémentaire
i
est inutile et le code serait très bien sans.comme C11 tag a été ajouté, note que C11 introduit VLAs prise en charge.
__STDC_NO_VLA__
objet macro est définie à 1
si spécifiques de mise en œuvre ne permet pas de les traiter.OriginalL'auteur user3769509 | 2014-10-18
Vous devez vous connecter pour publier un commentaire.
De longueur Variable tableaux ont été ajoutés à C99. Il est décrit dans le C99 justification:
6.7.5.2 Tableau declarators
Il n'y a pas de "tableau dynamique de l'allocation sur la pile". La taille du tableau doit être spécifié lors de la déclaration.
Certains compilateurs, comme GCC leur permettre une extension en C90 (GCC, c'est l'équivalent de la norme ansi et C89) mode et le C++. Dans ces cas, vous obtiendrez un avertissement (
-Wpedantic
) ou une erreur (-Werror
ou-pedantic-errors
). Consultez la documentation de votre compilateur.Par @Deduplicator commentaire, vous semblez avoir une idée fausse. De longueur Variable, les tableaux ne peuvent pas être déclarées static.
§ 6.7.6.2
Cela signifie que
static
de stockage et deautomatic
de stockage sont mutuellement exclusifs.OriginalL'auteur
Pour certains de se plonger dans la façon dont l'allocation d'une quantité variable de la mémoire sur la pile peut fonctionner, voir ce d'aborder comment un compilateur peut mettre en œuvre la (non normalisées)
alloca()
fonction:Alloca mise en œuvre
Le standard C99 offre La Longueur Variable des Tableaux ("VLA") avec essentiellement les mêmes fonctionnalités; bien que la mémoire est récupérée par la portée de base plutôt que par fonction:
Quelle est la différence entre les alloca(n) et char x[n]?
Il ya quelques raisons pour hésiter à utiliser de manière trop agressive avec la surabondance de la taille. Il n'y a aucun moyen de vérifier si la pile de la mémoire est disponible que vous pouvez tester pour savoir si un segment de mémoire est disponible via. NULL de
malloc()
. Si votre longueur variable tableau est trop grand, il va provoquer un débordement de pile et un comportement indéfini; vrai pour les deux méthodes d'allocation de pile:Pourquoi l'usage des alloca() pas considéré comme une bonne pratique?
OriginalL'auteur HostileFork
C est une telle fonctionnalité en tant que Variable de Tableaux de Longueur. Des tableaux avec automatique de la durée de stockage peut être défini dans le vol.
OriginalL'auteur Vlad from Moscow