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 :

memset vs '\0'


Sujet :

C

  1. #1
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut memset vs '\0'
    Bonjour,
    Juste une question, est-ce que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[256];
      buf[0] = '\0';
    peut avoir des comportement indéfinis alors que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[256];
      memset (buf, '\0', sizeof (buf);
    non?

    Merci
    Compil your life guy!
    The Aures Project

  2. #2
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    Comme buf semble être une chaîne de caractères, alors les deux sont valides. En effet, une chaîne de caractères se termine par '\0' donc tout ce qui suit après est tout bonnement ignoré.

  3. #3
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    oui mais est-ce que la première notation peut avoir des comportements indifinis qui peuvent nuir au fonctionnement de l'application?
    Compil your life guy!
    The Aures Project

  4. #4
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    toutes les fonctions qui utilisent les chaines de charactere sauront quoi faire si elles trouvent un 0 a la fin de la chaine.
    si le 0 est au debut (premier cas), la chaine est terminée:: la chaine est 'vide'.
    j'aurais tendance a utiliser le premier cas quand je suis sur de toujours passer &buf[0] a mes fonctions.
    si je dois passer buf+i, j'utilise plutot le memset.

    sinon il me semble qu'on peux faire:
    char buf[256] = 0;
    meme resultat que le memset ... mais au niveau code machine, je suis pas certain que le compilo fasse la meme chose. (j'en sais strictement rien en fait: ce serait interressant d'avoir l'avis de quelqu'un qui sais.)

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2002
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 120
    Par défaut
    oui mais est-ce que la première notation peut avoir des comportements indifinis qui peuvent nuir au fonctionnement de l'application?
    Non. Comme je l'ai dis, tout ce qui suit le '\0' est tout bonnement ignoré, donc que cela soit initialisé ou non n'a pas d'importance...

    char buf[256] = 0;
    meme resultat que le memset ...
    J'avoue ne pas bien comprendre. D'abord, tu sors du tableau (de taille 256 donc ses élements vont de 0 à 255 compris). Ensuite, si c'est une erreur et que tu voulais écrire buf[255], alors tu ne modifie que le caractère 255 alors qu'avec memset tu mets tous les caractères à 0.

  6. #6
    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 Re: [Question] memset vs '\0'
    Citation Envoyé par Goundy
    Juste une question, est-ce que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[256];
      buf[0] = '\0';
    peut avoir des comportement indéfinis alors que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char buf[256];
      memset (buf, '\0', sizeof (buf);
    non?
    Les deux sont valides.

  7. #7
    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 Goundy
    oui mais est-ce que la première notation peut avoir des comportements indifinis qui peuvent nuir au fonctionnement de l'application?
    Non.

  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 ShootDX
    char buf[256] = 0;
    meme resultat que le memset ...
    J'avoue ne pas bien comprendre. D'abord, tu sors du tableau
    Gné ! C'est une définition !

  9. #9
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    Ben si si on remplit la chaîne bêtement en faisant des trucs du style
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while ((c = fgetc(stdin)) != EOF && i < max)
    {
       tab[i++] = (char)c;
    }
    en oubliant de mettre le zéro final.
    (ce n'est pas forcément à recommender je te l'accorde, mais au moins le memset permet de se protéger).
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  10. #10
    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 Dark_Ebola
    sinon il me semble qu'on peux faire:
    C'est un tableau !
    meme resultat que le memset ... mais au niveau code machine, je suis pas certain que le compilo fasse la meme chose. (j'en sais strictement rien en fait: ce serait interressant d'avoir l'avis de quelqu'un qui sais.)
    Lorsqu'on défini un tableau avec une initialisation partielle, l'ensemble des valeurs non explicites est mis à 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      char a[4] = {'a'};
      assert (a[0] == 'a');
      assert (a[3] == 0);
    c'est garanti par le langage, que la variable soit 'static' ou 'auto'.

  11. #11
    Membre très actif Avatar de Goundy
    Profil pro
    Étudiant
    Inscrit en
    Avril 2005
    Messages
    605
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2005
    Messages : 605
    Par défaut
    Merci
    Compil your life guy!
    The Aures Project

  12. #12
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par Dark_Ebola
    sinon il me semble qu'on peux faire:
    C'est un tableau !
    , evidement ... je me trompe toujours (heuresement que le compilo me le signale ^^)

    et au niveau code machine generée par le compilo? tu sais si y'as une methode a preferer?
    une initialisation ou un memset?
    ou alors les compilos 'intelligents' generent le meme code machine?
    (je sais que ca sors un peu du cadre du sujet initial.)

  13. #13
    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 Dark_Ebola
    et au niveau code machine generée par le compilo? tu sais si y'as une methode a preferer?
    une initialisation ou un memset?
    ou alors les compilos 'intelligents' generent le meme code machine?
    (je sais que ca sors un peu du cadre du sujet initial.)
    Code machine ? C'est quoi ça

    Par contre, pour les types autres que char, memset() avec 0 n'est pas portable. En effet, on ne sait pas si le représentation 'all-bit-to-zero' est valide. Ca dépend de l'implémentation, alors que l'init est portable.

    Je préfère donc utiliser l'init. (très pratique dans le boucles...)

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

Discussions similaires

  1. [init memoire] memset en c++
    Par ZaaN dans le forum C++
    Réponses: 4
    Dernier message: 12/06/2007, 13h43
  2. [C ou C++]memset mais en ajoutant
    Par NiamorH dans le forum C++
    Réponses: 3
    Dernier message: 01/06/2007, 03h20
  3. Utilisation de memset()
    Par Kr00pS dans le forum C
    Réponses: 15
    Dernier message: 15/03/2007, 23h13
  4. memset, initialisation de variables.
    Par sympho dans le forum C
    Réponses: 4
    Dernier message: 31/12/2005, 21h20
  5. Memset sur une structure
    Par ghostdogpr dans le forum C
    Réponses: 4
    Dernier message: 16/12/2005, 13h43

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