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 :

Pourquoi doit-on initialiser une variable ou un tableau ?


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut Pourquoi doit-on initialiser une variable ou un tableau ?
    Bonjour,

    J'aimerais savoir pourquoi doit-on initialiser une variable ou un tableau ? J'aimerais comprendre le but précis de cette pratique.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    L'important est qu'une variable ait été écrite avant d'être lue, sinon la lecture donne n'importe quoi.

    Initialiser une variable permet d'être sûr qu'elle ne contienne jamais n'importe quoi.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 4
    Points : 3
    Points
    3
    Par défaut
    Il n'est pas obligatoire d'initialiser si j'ai bien compris ?

  4. #4
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 532
    Points
    3 532
    Par défaut
    Non ça n'est pas "obligatoire" si tu sais que ta variable sert à "d'abord" récupérer une valeur avant de l'envoyer ailleurs...

    La fonction time() va renvoyer un nombre et il sera utilisé après... donc dans ce cas tu déclares une variable "sans initialiser", puis dans le code la 1ère chose faite sera d'appeler time() et de mettre une valeur dans ta variable.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    time_t var;
     
    var = time();
    A l'inverse, si tu code en C89, le for permettra de ne pas avoir à initialiser la variable (si et seulement si tu t'en sers pour énumérer) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i;
     
    for (i = 0; i != 100; i++)
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    L'important est qu'une variable ait été écrite avant d'être lue, sinon la lecture donne n'importe quoi.
    Il faut cependant noter que les variables statiques sont automatiquement initialisées à 0 (ou 0.0 ou NULL suivant leur type).
    ɹǝsn *sıɹɐlos*

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par yuri200 Voir le message
    Il n'est pas obligatoire d'initialiser si j'ai bien compris ?
    Bonjour
    Non, ce n'est pas obligatoire. Certains le font systématiquement pour éviter "d'oublier" de le faire ; certains qui sont sûr d'eux n'initialisent que ce qu'il faut quand il le faut...
    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]

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Hello,

    Citation Envoyé par yuri200 Voir le message
    Il n'est pas obligatoire d'initialiser si j'ai bien compris ?
    Non, pas en C, car d'une part, la meilleure valeur initiale n'est pas forcément zéro plus qu'autre chose. C'est quand même vrai la plupart du temps mais dans tous les cas, ça dépend du contexte.

    Ensuite, parce que cela a un coût : si tu veux que ta variable ait une valeur initiale, il faut d'abord la stocker dans ton exécutable puis aller mettre explicitement cette valeur dans ta variable à l'exécution. Avec des langages de plus haut niveau, ces valeurs peuvent être garanties mais le C, lui, sert à écrire des programmes au plus proche de la machine pour se passer de l'assembleur. Il est donc plus important d'avoir un contrôle sur ces choes-là et de ne pas intégrer de « couches intermédiaires » implicites si ce n'est pas strictement nécessaire.

    Avec cela, il faut se souvenir que le C date de 1972 et que même aujourd'hui, il peut encore être utilisé pour produire des programmes sur des architectures modestes. À l'époque, les machines étaient nettement plus restreintes en mémoire et en rapidité d'exécution. Sans aller jusqu'au PDP-10 et aux mainframes à bande magnétique, le tout premier IBM PC de 1981 dont dérivent encore les machines actuelles n'était équipé que de 16 Kio de mémoire vive. Oui, 16384 octets de mémoire et pas un de plus.

  8. #8
    En attente de confirmation mail

    Profil pro
    Inscrit en
    Septembre 2013
    Messages
    639
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2013
    Messages : 639
    Points : 2 347
    Points
    2 347
    Par défaut
    Quelle est la définition de "initialiser" ?

    Est-ce :

    1) donner une valeur à la variable dès sa déclaration ?

    2) donner une première valeur à une variable, que cela soit avant la déclaration ou après ?

    Dans le deuxième cas, je serais curieux de voir un programme qui tient la route sans une seule initialisation.

    Dans le premier cas, bien sûr que l'initialisation n'est pas obligatoire, mais il faut quand même savoir ce que l'on fait...

  9. #9
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par CodeurPlusPlus Voir le message
    Quelle est la définition de "initialiser" ?

    Est-ce :

    1) donner une valeur à la variable dès sa déclaration ?

    2) donner une première valeur à une variable, que cela soit avant la déclaration ou après ?
    Hum, sémantiquement, "initialiser" dérive de "initial" (au début). Donc (selon moi) ça parlait de donner une valeur systématique à la création.
    Mais j'ai bien aimé la phrase de Medinoc qui dit qu'il faut simplement s'assurer de toujours écrire au-moins une fois avant de lire.

    Citation Envoyé par CodeurPlusPlus Voir le message
    Dans le deuxième cas, je serais curieux de voir un programme qui tient la route sans une seule initialisation.
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int main()
    {
        int i;
        printf("Hello world !\n");
        return 0;
    }
    ...
    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]

  10. #10
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 370
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 370
    Points : 23 625
    Points
    23 625
    Par défaut
    Citation Envoyé par CodeurPlusPlus Voir le message
    Quelle est la définition de "initialiser" ?

    Est-ce :

    1) donner une valeur à la variable dès sa déclaration ?
    2) donner une première valeur à une variable, que cela soit avant la déclaration ou après ?
    Cela signifie littéralement « mettre dans l'état initial ». Et quand on remet — ou ramène — une variable ou n'importe quel système à l'état initial, on dit « réinitialiser », dit « reset » en anglais, qui se traduit plutôt par « réarmer ».

    Ça se réfère surtout aux automates finis dans lequel on a généralement un ou plusieurs points de départ. Un système est toujours forcément dans un des états que l'on a défini (par exemple : allumé ou éteint) mais s'il sert à prendre une décision ou faire un calcul, on définit aussi explicitement l'état dans lequel il doit se trouver au moment où l'on démarre le processus.

    A priori, l'initialisation des variables doit donc avoir lieu avant l'exécution du programme et c'est pour cela qu'il existe une section spécialisée dans les fichiers exécutables contenant toutes ces valeurs initiales quand elles ne sont pas nulles. En pratique, ça dépend de l'endroit où tu places ton périmètres : tu peux très bien initialiser une variable à l'exécution avant de rentrer dans une routine ou au tout début de celle-ci.

    En ce sens, cela tombe sous le coup de ton cas numéro « 2) ». Par contre, « donner une première valeur » n'est pas une définition suffisante. En effet, dans l'exemple suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <stdio.h>
     
    int main (void)
    {
        char c;
        c = fgetc(stdin);
     
        printf ("%c\n",c);
        return 0;
    }
    « c » n'a pas du tout besoin d'être initialisée pour garantir le succès de l'opération : ni pour le bon fonction de fgetc(), ni pour la validité des données que l'on en tire après.

  11. #11
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Citation Envoyé par CodeurPlusPlus Voir le message
    Quelle est la définition de "initialiser" ?

    Est-ce :

    1) donner une valeur à la variable dès sa déclaration ?
    Oui.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int i=10; // <- initialisation
    int j;    // <- déclaration
    j=10;     // <- affectation
    2) donner une première valeur à une variable, que cela soit avant la déclaration ou après ?
    On ne peut pas donner une valeur à une variable avant sa déclaration, c'est soit en même temps, sois plus tard, soit jamais ...
    ɹǝsn *sıɹɐlos*

  12. #12
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    On ne peut pas donner une valeur à une variable avant sa déclaration, c'est soit en même temps, sois plus tard, soit jamais ...
    Hum... pas certain...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i=123;                // Définition de i - Initialisation dans la foulée
     
    int main()
    {
         extern int i;    // Déclaration de i (pas obligatoire mais facilite la relecture et la maintenance)
         printf("i=%d\n", i);   // Affichera i=123
    }

    On a donc bien une initialisation... avant la déclaration...
    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]

  13. #13
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 882
    Points
    7 882
    Par défaut
    Bien vu, je voulais bien sûr dire on ne peut pas affecter une variable avant sa définition.
    ɹǝsn *sıɹɐlos*

  14. #14
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 145
    Points
    23 145
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Hum... pas certain...
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int i=123;                // Définition de i - Initialisation dans la foulée
     
    int main()
    {
         extern int i;    // Déclaration de i (pas obligatoire mais facilite la relecture et la maintenance)
         printf("i=%d\n", i);   // Affichera i=123
    }

    On a donc bien une initialisation... avant la déclaration...
    Je ne suis pas d'accord, en faisant :
    int i = 123; tu déclares bien i.
    Si tu fait extern int i, c'est que ta variable aura été déclarée ailleurs.

  15. #15
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    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 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Neckara Voir le message
    Je ne suis pas d'accord, en faisant :
    int i = 123; tu déclares bien i.
    Si tu fait extern int i, c'est que ta variable aura été déclarée ailleurs.
    Pas nécessairement "déclarée" mais obligatoirement "définie" ailleurs. C'était une finasserie (débile certes mais tellement pleine d'humour) sur la distinction entre déclaration et définition.
    Jilliagre ne s'y est d'ailleurs pas trompé
    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]

Discussions similaires

  1. [MFC] initialiser une variable a l'heure courante
    Par jiraya43 dans le forum MFC
    Réponses: 4
    Dernier message: 09/05/2006, 16h13
  2. Réponses: 4
    Dernier message: 19/04/2006, 16h03
  3. Réponses: 6
    Dernier message: 04/04/2006, 13h12
  4. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57
  5. Réponses: 9
    Dernier message: 29/06/2004, 08h40

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