Pourquoi le tableau a
n'est-il pas initialisé par la variable globale size
?
#include<stdio.h>
int size = 5;
int main()
{
int a[size] = {1, 2, 3, 4, 5};
printf("%d", a[0]);
return 0;
}
L'erreur de compilation est indiquée comme
l'objet de taille variable peut ne pas être initialisé
Selon moi, le tableau doit être initialisé par size
.
Et quelle serait la réponse si j'insiste pour utiliser la variable globale (si cela est possible)?
En C99, 6.7.8/3:
Le type de l'entité à initialiser doit être un éventail de taille inconnue ou d'un type d'objet qui n'est pas un type de réseau de longueur variable.
6.6/2:
Une expression constante peut être évaluée lors de la traduction plutôt que de l'exécution
6.6/6:
Une expression constante entière doit avoir un type entier et disposer d'opérandes uniquement des constantes entière, des constantes de dénombrement, des constantes de caractère, de la taille d'expressions dont les résultats sont des constantes entière et des constantes flottantes qui sont les opérandes immédiates des mises.
6.7.5.2/4:
Si la taille est une expression constante entière et que le type d'élément a une taille constante connue, le type de réseau n'est pas un type de réseau de longueur variable; Sinon, le type de tableau est un type de réseau de longueur variable.
a
a un type de matrice de longueur variable, car size
n'est pas une expression constante entière. Ainsi, il ne peut pas avoir une liste d'initialistes.
En C90, il n'y a pas de VLAS, le code est donc illégal pour cette raison.
En C++, il n'y a pas non plus de VLAS, mais vous pouvez faire size
a const int
. C'est parce que dans C++, vous pouvez utiliser const int
variables dans les glaces. En C, vous ne pouvez pas.
Vous n'avez probablement pas l'intention de a
d'avoir une longueur variable, alors ce dont vous avez besoin est la suivante:
#define size 5
Si vous avez réellement l'intention de a
d'avoir une longueur variable, je suppose que vous pouviez faire quelque chose comme ceci:
int a[size];
int initlen = size;
if (initlen > 5) initlen = 5;
memcpy(a, (int[]){1,2,3,4,5}, initlen*sizeof(int));
Ou peut-être:
int a[size];
for (int i = 0; i < size && i < 5; ++i) {
a[i] = i+1;
}
Il est difficile de dire, cependant, ce que "devrait" arriver ici dans le cas où la taille! = 5. Il n'a pas vraiment de sens de spécifier une valeur initiale de taille fixe pour une matrice de longueur variable.
Vous n'avez pas besoin de dire au compilateur quelle est la taille de la matrice si vous donnez un initialiseur. Le compilateur comprendra la taille en fonction du nombre d'éléments que vous l'initialisez.
int a[] = {1,2,3,4,5};
Ensuite, vous pouvez même laisser le compilateur vous dire la taille en obtenant la taille totale de la matrice en octets sizeof(a)
et en la divisant par la taille d'un élément sizeof(a[0])
:
int size = sizeof(a) / sizeof(a[0]);
Le compilateur ne peut pas supposer que la valeur de la taille est toujours 5 au moment de la main-même () obtient le contrôle. Si vous voulez une véritable constante dans un projet de style C, utilisez:
#define size 5
On dirait que votre compilateur n'est pas conforme au C99 ... parle de laquelle, quel compilateur utilisez-vous? Si c'est GCC, vous devez passer le commutateur '-Std = C99' .... Si vous utilisez un compilateur de Pre-C99, cette déclaration est illégale, si c'est le cas, faites-le:
int main () {[.____] int A [5] = {1,2,3,4,5}; printf ("% d", a [0]); [.____] retour 0; }
Dans les compilateurs standard de Pre-C99, utilisez une constante au lieu d'une variable.
Edit: Vous pouvez en savoir plus sur la norme C99 ici ... et ici . ...
size
est une variable et c ne vous permet pas de déclarer ( éditer: C99 vous permet de les déclarer, tout simplement pas les initialiser comme si vous faites) des tableaux avec une taille variable comme celle-ci. Si vous souhaitez créer un tableau dont la taille est une variable, utilisez Malloc ou faites la taille une constante.
Le compilateur doit connaître la taille de la matrice tout en le déclarant. Parce que la taille d'un tableau ne change pas après sa déclaration. Si vous mettez la taille de la matrice dans une variable, vous pouvez imaginer que la valeur de cette variable changera lorsque le programme est exécuté. Dans ce cas, le compilateur sera obligé d'allouer une mémoire supplémentaire à ce tableau. Dans ce cas, cela n'est pas possible car la matrice est une structure de données statique allouée sur la pile. J'espère que cela aidera.
#include<stdio.h>
/* int size=5; */
#define size 5 /* use this instead*/
/*OR*/
int a[size]={1,2,3,4,5}; /* this*/
int main()
{
int a[size]={1,2,3,4,5};
printf("%d",a[0]);
return 0;
}
int size
signifie que size
est une variable et c ne permet pas variablesize
tableaux.
J'utilise VS2008 où vous utilisez
const int size=5;
permet
int a[size]={1,2,3,4,5};