Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

declaration de tableau statique

9 réponses
Avatar
SoULiAne
Bonjour,

Je voudrais savoir ce qui est permis par la norme et ce qui ne l'est
pas, parmis les exemples suivants :


#define MAX 30
int main (void)
{
int tab[MAX];
}




#include <stdlib.h>
int main (int argc, char **argv)
{
int max=atoi(argv[1]);
int tab[max];
}




void truc (int n)
{
int tab[n];
}
int main(void)
{
int n=5;
}




#include <stdio.h>
void truc (int n)
{
int tab[n];
}
int main(void)
{
int n;
scanf("%d", &n);
}




Merci !

9 réponses

Avatar
Randolf Carter
#define MAX 30
int main (void)
{
int tab[MAX];
}


Pas de problème.


#include <stdlib.h>
int main (int argc, char **argv)
{
int max=atoi(argv[1]);
int tab[max];
}


Non, car il s'agit ici d'une allocation dynamique.
Dynamique = la taille à allouer n'est pas connu à la compilation mais
seulement à l'exécution. Si tu tiens absolument à allouer dynamiquement sur
la pile tu peux utiliser l'appel alloca() sinon c'est sur la heap avec
malloc().



void truc (int n)
{
int tab[n];
}


Même topo que ci dessus.

int main(void)
{
int n=5;
}


Euh tu voulais appeler truc(n) là non ?


#include <stdio.h>
void truc (int n)
{
int tab[n];
}
int main(void)
{
int n;
scanf("%d", &n);
}


Même commentaire.


Merci !


De rien.

--
- Randolf

Avatar
Marc Lasson
Randolf Carter wrote:
#include <stdlib.h>
int main (int argc, char **argv)
{
int max=atoi(argv[1]);
attention : si argc = 1, ca peut faire trés mal ...


int tab[max];
}



Non, car il s'agit ici d'une allocation dynamique.
Dynamique = la taille à allouer n'est pas connu à la compilation mais
seulement à l'exécution. Si tu tiens absolument à allouer dynamiquement sur
la pile tu peux utiliser l'appel alloca() sinon c'est sur la heap avec
malloc().


En C99, c'est permis.

void truc (int n)
{
int tab[n];
}



Même topo que ci dessus.
Idem ;).


--
Marc.


Avatar
SoULiAne
Le Tue, 13 Jan 2004 21:23:21 +0100, "Randolf Carter"


Euh tu voulais appeler truc(n) là non ?
Oui oui désolé :) ...


Donc celui là :


void truc (int n)
{
int tab[n];
}
int main(void)
{
int n=5;
truc(n);
}


est faux ?
Le compilateur ne voit-il pas que n n'est pas modifié dans tout le
programme ? Pendant la compilation, les fonctions sont-elles traitées
indépendemment les unes des autres ?

Avatar
SoULiAne
Le Tue, 13 Jan 2004 22:10:11 +0100, Marc Lasson

En C99, c'est permis.


Ne sait meme pas ce que c'est :)

Pourquoi est ce permis ? Est-il automatiquement géré comme un tableau
dynamique (j'entend par là, sans que la personne qui fait son programme
n'ait a s'occuper de la mémoire) ?

Avatar
Éric Lévénez
Le 13/01/04 22:35, dans ,
« SoULiAne » a écrit :

Le Tue, 13 Jan 2004 22:10:11 +0100, Marc Lasson

En C99, c'est permis.


Ne sait meme pas ce que c'est :)


C'est le petit nom de la norme ISO du langage C actuelle.

Tout est expliqué dans la FAQ.

Pourquoi est ce permis ?


Parce que c'est dans la norme du langage.

Est-il automatiquement géré comme un tableau
dynamique (j'entend par là, sans que la personne qui fait son programme
n'ait a s'occuper de la mémoire) ?


Oui, mais il ne faut pas faire des tableaux trop grands car il n'y a pas de
code de retour en cas d'erreur d'allocation comme avec un malloc.

--
Éric Lévénez -- <http://www.levenez.com/>
Unix is not only an OS, it's a way of life.


Avatar
Marc Lasson
SoULiAne wrote:
Le Tue, 13 Jan 2004 22:10:11 +0100, Marc Lasson


En C99, c'est permis.



Ne sait meme pas ce que c'est :)
C'est la derniere norme du C (ie si tu as un compilateur récent, ca

devrait à peu près marcher).

Pourquoi est ce permis ?
Parceque. Je sais pas moi, mais ils doivent bien avoir de bonnes raisons

les grandes gens.

Est-il automatiquement géré comme un tableau
dynamique (j'entend par là, sans que la personne qui fait son programme
n'ait a s'occuper de la mémoire) ?
(je suis pas sur d'avoir compris la question)

Oui, tu n'as pas à t'occuper de la mémoire.
Le problème c'est que justement si tu fais ca dans une fonction
recursive appellée un nombre suffisant de fois, ca risque d'imploser.
Alors qu'avec un malloc() tu aurai pu gérer le manque de mémoire.
Mais je pense qu'avec la fonction proposé par Randolf, le comportement
est le même que celui avec le tableau à taille variable (il n'y a
pas de gestion d'erreur avec alloca).

Je peux me tromper (ça arrive souvent d'ailleurs ;)).

--
Marc.


Avatar
Marc Lasson
SoULiAne wrote:
void truc (int n)
{
int tab[n];
}
int main(void)
{
int n=5;
truc(n);
}


est faux ?
En C89 (la norme avant le C99 ;)), oui.


Le compilateur ne voit-il pas que n n'est pas modifié dans tout le
programme ?
Non, tu lui en demande trop, le compilateur ne compile que des sources

"grammaticalement" valide et le C89 ne défininit pas la déclaration
d'un tableau avec une variable (même déclarée "const").


Pendant la compilation, les fonctions sont-elles traitées
indépendemment les unes des autres ?
Je ne sais pas, il faudrai demander à ceux qui font des compilateurs C.

<a prendre avec des pinces>
Mais, j'ai "l'intuition" que oui (à part peut-être dans les cas
d'inlining), car de tels optimisations me semblent vraiment compliquées.
</a prendre avec des pinces>

--
Marc, hésitant.

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', SoULiAne wrote:

#define MAX 30
int main (void)
{
int tab[MAX];
}


Ok.

#include <stdlib.h>
int main (int argc, char **argv)
{
int max=atoi(argv[1]);
int tab[max];


Uniquement en C99.

}



void truc (int n)
{
int tab[n];


Uniquement en C99.

}
int main(void)
{
int n=5;


truc (n); /* je suppose... */
}

#include <stdio.h>
void truc (int n)
{
int tab[n];


Uniquement en C99.

}
int main(void)
{
int n;
scanf("%d", &n);


truc (n); /* je suppose... */
}



--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/

Avatar
Emmanuel Delahaye
In 'fr.comp.lang.c', "Randolf Carter" wrote:

Si tu tiens absolument à allouer dynamiquement sur
la pile tu peux utiliser l'appel alloca()


alloca() n'est pas standard

--
-ed- [remove YOURBRA before answering me]
The C-language FAQ: http://www.eskimo.com/~scs/C-faq/top.html
C-reference: http://www.dinkumware.com/manuals/reader.aspx?lib=cpp
FAQ de f.c.l.c : http://www.isty-info.uvsq.fr/~rumeau/fclc/