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 :

Init tableau a null


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut Init tableau a null
    Bonjour,

    Petite question sur l'initialisation d'une table, n'ayant pas de K&R (si quelqu'un a une adresse pour une version online au passage ), j'ai pu trouver plusieurs réponses se contredisant sur le net.

    Soit une init d'une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int x[10] = {0};
    int y[10] = {1}
    La table de x sera mise a 0 totalement, pour y, seulement la premiere case a 1 puis les autres a 0.
    J'ai pu lire ici et la qu'une init uniforme et totale d'une table n'était possible qu'avec null. Puis ds la faq:
    '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é.
    C'est a dire qu'en initialisant avec int t[10] = {x}, seulement la premiere valeur prendra x et les autres null, donc en mettant x a null on peut avoir toute la table a null.
    Qu'en dit le standard ? Est ce indépendant du compilateur ?

    Merci d'avance,
    C'est pas une question super importante mais juste pour clarifier ce petit point face a ce que dit le standard.

  2. #2
    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
    La norme impose ce comportement.

    Si x est un objet en allocation statique (global ou déclaré static) il est initialisé par des zéros.
    Si il est en allocation automatique (déclaré dans un bloc à l'intérieur d'une fonction et non déclaré static), il n'est pas initialisé et son contenu est indéterminé.

    y est initialisé par 1 pour son premier élément et 0 pour les autres.

    z est un tableau de 3 éléments (la liste d'initialisation a 3 valeurs) initialisé par les trois valeurs 1, 2, 3

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 805
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sone47 Voir le message
    Bonjour,

    Petite question sur l'initialisation d'une table, n'ayant pas de K&R (si quelqu'un a une adresse pour une version online au passage ),
    Désolé, K&R étant sous copyright, ce serait étonnant qu'on t'en propose sur les forums. Accessoirement il y a tout un tas de tutos gratuits de très bon niveau.

    Citation Envoyé par sone47 Voir le message
    j'ai pu trouver plusieurs réponses se contredisant sur le net.
    Héhé. C'est le problème du net. Tout le monde peut dire n'importe quoi.

    Citation Envoyé par sone47 Voir le message
    Soit une init d'une table:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int x[10] = {0};
    int y[10] = {1}
    La table de x sera mise a 0 totalement, pour y, seulement la premiere case a 1 puis les autres a 0.
    Exact
    Citation Envoyé par sone47 Voir le message
    J'ai pu lire ici et la qu'une init uniforme et totale d'une table n'était possible qu'avec null.
    Exact. Si l'initialisation commence mais qu'il n'y a pas assez de constantes explicites pour couvrir tout le tableau, les autres éléments sont alors initialisés à 0.

    Citation Envoyé par sone47 Voir le message
    C'est a dire qu'en initialisant avec int t[10] = {x}, seulement la premiere valeur prendra x et les autres null, donc en mettant x a null on peut avoir toute la table a null.
    Exact

    Citation Envoyé par sone47 Voir le message
    C'est pas une question super importante mais juste pour clarifier ce petit point face a ce que dit le standard.
    Pas de pb. Toutefois je vais faire qq remarques personnelles
    1) il faut essayer de ne pas parler de "null" à la place de 0. Même si la valeur "null" est équivalente à 0, le terme "null" s'emploie plutôt pour les pointeurs.
    Pour les entiers, on parlera plutôt de "0"
    Pour les caractères, on pourra utiliser la notation '\0' afin de montrer qu'on ne confond pas 0 et '0'

    2) généralement, je trouve l'initialisation par défaut inutile vu que pour toute variable (ou tableau) défini(e), il est assez logique de supposer que la variable (le tableau) sera d'abord rempli avant d'être traité. Et donc initialiser une variable (un tableau) avec des valeurs par défaut alors qu'il sera ensuite rempli avec des valeurs utiles est une perte de temps et d'énergie.
    Ce qui ne veut pas dire que ce soit tout le temps inutile bien sûr. Une initialisation peut se justifier si, par exemple, on veut détecter s'il y a eu remplissage ou pas. Ou alors pour les pointeurs qui, par exemple, doivent être alloués/réalloués, il peut être utile de les initialiser à NULL car la fonction realloc, si on lui passe un pointeur NULL, se comporte alors comme un malloc ce qui évite de s'embêter à distinguer, dans le code, un malloc d'un realloc.
    Tout ça pour dire que si l'initialisation peut se concevoir/justifier, rien n'oblige à la systématiser...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 366
    Par défaut
    Merci beaucoup pour ces infos.
    Pour le K&R je ne savais pas,

    Une initialisation peut se justifier si, par exemple, on veut détecter s'il y a eu remplissage ou pas.
    C'est exactement pour cela que je l'utilise.
    Ok pour les differences 0, '\0' et null,

    En tout cas merci pour ces remarques.
    Bonne journée

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

Discussions similaires

  1. init Tableau taille
    Par ancrou dans le forum C++
    Réponses: 6
    Dernier message: 08/07/2008, 16h04
  2. [AIDE] Pb Init Tableau
    Par Diablo_22 dans le forum Collection et Stream
    Réponses: 29
    Dernier message: 24/05/2007, 18h24
  3. Réponses: 10
    Dernier message: 30/06/2006, 17h41
  4. tableau valeur nulle
    Par asma06 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 09/06/2006, 10h31
  5. [VBA-E] Tableau croisé dynammique et Init
    Par comme de bien entendu dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/11/2005, 12h34

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