IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Initialiser un tableau à zéro


Sujet :

C

  1. #1
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut Initialiser un tableau à zéro
    Bonjour,

    Dans la FAQ C, dans le sujet Que signifie 'int t[10] = {10, 20};' ?, il est écrit :
    'int t[10] = {10, 20};' crée un tableau de 10 éléments initialisé avec les valeurs t[0] = 10, t[1] = 20 et t[2] à t[9] = 0.
    Notez bien que la mise à 0 des éléments non initialisés d'une variable locale tableau n'a lieu que lorsqu'un élément au moins a été initialisé.
    Pourtant j'initialise régulièrement mes tableaux de cette manière pour que mes éléments soient mis à zéro :
    C'est une erreur de ma part de procéder ainsi ou pas ?

  2. #2
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Par défaut
    A priori si tu veux etre sur que tes tableaux soient bien initialisees a 0, utilise memset().

  3. #3
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    Bonjour,

    La norme n'autorise pas une liste vide "d'initialisateurs", il est donc obligatoir de mettre au moins un élément. et pour initialiser tout le tableau à zéro :

    Sinon pour le code :

    J'ai ceci comme messages :

    ||=== tests, Debug ===|
    C:\Documents and Settings\C_Worlbench\tests\main.c||In function 'main'
    C:\Documents and Settings\C_Worlbench\tests\main.c|5|warning: ISO C forbids empty initializer braces|
    ||=== Build finished: 0 errors, 1 warnings ===|

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    A priori si tu veux etre sur que tes tableaux soient bien initialisees a 0, utilise memset().
    Pour un tableau de int, effectivement cela fonctionne bien. Pour d'autres types le comportement n'est pas le même, par exemple pour un pointeur :
    • L'initialisation via une liste incomplète force bien l'initialisation des autres pointeurs à NULL.
    • memset(...,0,...), quant à lui, va forcer l'initialisation des pointeurs à "tous les bits à 0" or rien ne garanti que la représentation du pointeur NULL soit "tous les bits à 0".

  5. #5
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Janvier 2011
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 81
    Par défaut
    Citation Envoyé par uknow Voir le message
    Bonjour,

    La norme n'autorise pas une liste vide "d'initialisateurs", il est donc obligatoir de mettre au moins un élément. et pour initialiser tout le tableau à zéro :

    En effet, je crois que j'ai un peu fumé la moquette. C'est plutôt ça que j'utilise d'habitude. Au temps pour moi.

  6. #6
    Membre éclairé Avatar de domiq44
    Homme Profil pro
    Inscrit en
    Novembre 2005
    Messages
    302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2005
    Messages : 302
    Par défaut
    Bonjour,

    De temps en temps je vois ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char pipo[20+1] = "";
    pour initialiser une chaine de 20 caractères au lieu de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    memset (pipo, 0, sizeof (pipo));
    Que se passe-t-il alors ?

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Lorsqu'un tableau dont la taille est explicitement déclarée est initialisé avec une chaine trop courte, le reste du tableau est initialisé avec la valeur par défaut (celle utilisée pour les tableaux static) donc ici 0.

    Le résultat sera le même dans les deux cas. Par contre le premier cas est une initialisation (qui peut dans certains cas être faite à la compilation) et le second est plutôt une affectation, obligatoirement faite à l'exécution.

  8. #8
    Membre éprouvé
    Inscrit en
    Juin 2008
    Messages
    91
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 91
    Par défaut
    C99 / 6.7.8 - 21 :
    If there are fewer initializers in a brace-enclosed list than there are elements or members of an aggregate, or fewer characters in a string literal used to initialize an array of known size than there are elements in the array, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration.
    La confirmation de ce qui est dit ci-dessus

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 35
    Dernier message: 14/02/2006, 18h57
  2. Réponses: 7
    Dernier message: 31/01/2006, 22h34
  3. initialiser un tableau 2D dans le main
    Par miminou dans le forum C++
    Réponses: 5
    Dernier message: 20/12/2005, 10h35
  4. [LG] Jeu mémory : initialisation de tableau
    Par DarkLords dans le forum Langage
    Réponses: 1
    Dernier message: 19/10/2005, 15h13
  5. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo