web-dev-qa-db-fra.com

Pourquoi ne puis-je pas créer de matrice de taille déterminée par une variable globale?

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)?

20
Ashish Yadav

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.

22
Steve Jessop

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]);
9
indiv

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
6
Seva Alekseyev

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 . ...

3
t0mm13b

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.

3
IVlad

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.

2
Abderrahmen
#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}; 
0
Pratik Deoghare