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 :

char buffer[256] = {0} -> Mauvaise initialisation ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut char buffer[256] = {0} -> Mauvaise initialisation ?
    Mon maitre de stage m'a dit qu'il avait déja eues de mauvaises surprises avec ce type d'initialisation, qu'à la place il valait mieux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(buffer, 0, 256);
    Est-ce que quelqu'un confirme ? ou est-ce qu'il est simplement complètement parano ?

  2. #2
    Membre expérimenté Avatar de lun4t1k
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    276
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 276
    Par défaut
    S'il vient sur les forums, tu vas toi aussi avoir une surprise
    J'utilise bzero, mais vaut mieux memset pour un max de portabilité.
    Et je n'ai jamais init un char comme toi...

  3. #3
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Nan,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {0};
    est correct
    Pour etre plus precis il vaudrait mieux ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {'\0'};
    L'autre ecriture possible est
    Si tu veux utiliser memset sur un tableau de taille fixe, un bon reflexe est d'utiliser sizeof
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(buffer, 0, sizeof buffer);

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Gruik
    Nan,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {0};
    est correct
    Pour etre plus precis il vaudrait mieux ecrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {'\0'};
    L'autre ecriture possible est
    Les trois écritures sont correctes. La 3ème économise le clavier et les disques durs...

  5. #5
    Membre Expert
    Homme Profil pro
    Dév. Java & C#
    Inscrit en
    Octobre 2002
    Messages
    1 414
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dév. Java & C#
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 414
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Les trois écritures sont correctes. La 3ème économise le clavier et les disques durs...
    Une question:

    Avec la 3ème solution, est-ce que tout le tampon (variable buffer) est initialisé avec la valeur 0 ou seulement le premier caractère, indiquant ainsi une chaîne de caractère vide?

  6. #6
    Membre Expert
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Par défaut
    Citation Envoyé par jowo
    Une question:

    Avec la 3ème solution, est-ce que tout le tampon (variable buffer) est initialisé avec la valeur 0 ou seulement le premier caractère, indiquant ainsi une chaîne de caractère vide?
    Je confirme que tout le buffer est initialisé à 0
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main() {
    	char buffer[4] = "";
    	int i;
     
    	for(i = 0; i < 4; i++) {
    		printf("0x%02X\n", buffer[i]);
    	}
     
    	return 1;
    }
    me renvoie
    0x00
    0x00
    0x00
    0x00

  7. #7
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {0};
    Cette initialisation est en effet correct. Toutefois, il faudra noter que ça ne marche qu'avec la valeur 0.
    En effet, on serait tenté de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {1};
    en esperant que les 256 cases seraient initialisés à 1.
    Malheuresement ce n'est pas le cas. Seul la première case sera initialisé à 1 et le reste du tableau à 0 (à confirmer).

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par crocodilex
    on serait tenté de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char buffer[256] = {1};
    en esperant que les 256 cases seraient initialisés à 1.
    Malheuresement ce n'est pas le cas. Seul la première case sera initialisé à 1 et le reste du tableau à 0 (à confirmer).
    Je confirme que cette assertion est tout à fait conforme à la norme.

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par muad'dib
    Mon maitre de stage m'a dit qu'il avait déja eues de mauvaises surprises avec ce type d'initialisation, qu'à la place il valait mieux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(buffer, 0, 256);
    Est-ce que quelqu'un confirme ? ou est-ce qu'il est simplement complètement parano ?
    J'ai effectivement eu des problèmes avec CCS (Code Composer Studio) pour DSP Texas Instrument. Il convient donc de vérifier avant, surtout en embarqué. Mais il n'y a aucun risque avec les compilateurs courants pour plateformes hébergées (Windows, unixoides, mac etc.)

Discussions similaires

  1. Mauvaise initialisation ?
    Par Premium dans le forum C
    Réponses: 6
    Dernier message: 29/11/2006, 12h16
  2. Réponses: 3
    Dernier message: 08/11/2006, 09h54
  3. Pb d'initialisation de char*
    Par tsp dans le forum C++
    Réponses: 2
    Dernier message: 28/03/2006, 10h12
  4. passer unee struct dans un buffer (char *)
    Par baert dans le forum C++
    Réponses: 2
    Dernier message: 20/02/2006, 21h49
  5. Borland + sqlite (aducom) + string > 256 char = pas conte
    Par spyroux dans le forum C++Builder
    Réponses: 1
    Dernier message: 16/12/2005, 22h48

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