[Débutant] Déclaration d'un tableau norme C99
Bonjour,
J'ai eu un cours d'amphi dernierement ou le prof expliquait que, depuis la norme de 99, il est possible de déclarer un tableau de cette manière :
Code:
1 2 3 4 5 6
|
int f(int n)
{
int t[n];
...
} |
Cependant, cela est accepté car ici n est une variable locale. Si nous avions utilisé une variable de classe statique, alors cela aurait été refusé à la compilation. Je lui ai demandé pourquoi, mais je n'ai pas vraiment compris son explication (il est parti dans un délire avec la pile....)
De retour chez moi, je test donc un petit programme avec une variable globale:
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| #include <stdio.h>
int m = 5;
void f()
{
int t[m];
int i;
for (i = 0 ; i < m ; i++)
{
t[i] = i;
printf("t[%d] = %d\n", i , t[i]);
}
}
main()
{
f();
} |
Et ça marche... :
Code:
1 2 3 4 5 6
| kal@vaio ~ $ ./test
t[0] = 0
t[1] = 1
t[2] = 2
t[3] = 3
t[4] = 4 |
Y a t il quelqu'un pour m'expliquer réellement ce qu'il se passe depuis cette norme de 99 ? :lol:
Re: [Débutant] Déclaration d'un tableau norme C99
Citation:
Envoyé par _kal_
Je lui ai demandé pourquoi, mais je n'ai pas vraiment compris son explication (il est parti dans un délire avec la pile....)
C'est pas un "délire"...
Re: [Débutant] Déclaration d'un tableau norme C99
Citation:
Envoyé par _kal_
Si nous avions utilisé une variable de classe statique, alors cela aurait été refusé à la compilation. Je lui ai demandé pourquoi, mais je n'ai pas vraiment compris son explication (il est parti dans un délire avec la pile....)
As-tu bien compris la restriction dont-il parlait ?
Parce que a ma connaissance, la variable contenant la taille du tableau peut etre globale ou static sans souci.
Par contre, un tableau dont la taille est une variable (VLA) ne peut pas etre static ou extern, ni membre d'une structure ou d'une union :
Citation:
Envoyé par C99
All declarations of variably modified (VM) types have to be at either block scope or function prototype scope. Array objects declared with the static or extern storage-class specifier cannot have a variable length array (VLA) type. However, an object declared with the static storageclass specifier can have a VM type (that is, a pointer to a VLA type). Finally, all identifiers declared with a VM type have to be ordinary identifiers and cannot, therefore, be members of structures or unions.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| extern int n;
int A[n]; // invalid: file scope VLA
extern int (*p2)[n]; // invalid: file scope VM
int B[100]; // valid: file scope but not VM
void fvla(int m, int C[m][m]); // valid: VLA with prototype scope
void fvla(int m, int C[m][m]) // valid: adjusted to auto pointer to VLA
{
typedef int VLA[m][m]; // valid: block scope typedef VLA
struct tag
{
int (*y)[n]; // invalid: y not ordinary identifier
int z[n]; // invalid: z not ordinary identifier
};
int D[m]; // valid: auto VLA
static int E[m]; // invalid: static block scope VLA
extern int F[m]; // invalid: F has linkage and is VLA
int (*s)[m]; // valid: auto pointer to VLA
extern int (*r)[m]; // invalid: r has linkage and points to VLA
static int (*q)[m] = &B; // valid: q is a static block pointer to VLA
} |