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 :

comment NULL est stocké dans la mémoire (s'il l'est déjà) ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut comment NULL est stocké dans la mémoire (s'il l'est déjà) ?
    Bonsoir,
    je me demande si, pour un char par exemple qui est stocké sur un octet = 8bits = offre 2^8 possibilités de combiner les 0 et les 1 soit entre 0d et 255d, la "valeur" NULL est représenter par quoi ? Je ne croix pas à que ça soit une des ces 256 valeurs puisque NULL a sa particularité, en même temps la mémoire c'est la mémoire... ?

    Merci d'avance, et je me souhaite la bienvenue parmi vous

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    En reprenant la définition de la FAQ C de dvp.com
    NULL est une macro définie dans <stddef.h> (qui est inclus par stdio.h, stdlib.h, etc.) et sert à représenter une adresse invalide. NULL est par exemple utilisé dans les fonctions retournant un pointeur pour indiquer que la fonction a échoué. Affecter NULL à un pointeur sert donc à indiquer que le pointeur est actuellement inutilisé (ou pointe « nulle-part »). La norme stipule que n'importe quelle expression entière valant 0 ou une telle expression castée en void * représente une telle adresse.
    Concrètement, la valeur NULL est considéré comme une "constante ayant pour valeur 0" par le standard C.

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Achraf-A Voir le message
    je me demande si, pour un char par exemple qui est stocké sur un octet = 8bits = offre 2^8 possibilités de combiner les 0 et les 1 soit entre 0d et 255d, la "valeur" NULL est représenter par quoi ? Je ne croix pas à que ça soit une des ces 256 valeurs puisque NULL a sa particularité, en même temps la mémoire c'est la mémoire... ?
    Bonjour

    Et pourquoi donc NULL ne serait-il pas représenté par une de ces 256 valeurs ??? NULL n'a aucune particularité "particulière" pour l'ordinateur. C'est simplement une valeur qui sert de repère aux programmeurs (donc aux humains). Si tous les programmeurs adoptent la même convention, il n'y a alors aucun soucis.

    NULL vaut pour l'instant 0 mais peut-être que demain il vaudra 18 ou 77, à priori c'est une possibilité. Toutefois c'est quand-même peu probable car NULL sert beaucoup pour la gestion des adresses mémoires et si l'adresse mémoire "0" n'existe pas et ne peut pas venir mettre le boxon, l'adresse 18 ou 77 existe ; or une des règles impératives d'utilisation d'une valeur "témoin" est que cette valeur ne se retrouve pas par accident dans les valeurs "utilisables". Mais si l'ordi de demain n'utilise plus que des adresses mémoires entre 155 et 40000, alors rien n'interdira à NULL de valoir 1 ou 2 ou 18 ou 154 ou 40001...

    Citation Envoyé par Achraf-A Voir le message
    et je me souhaite la bienvenue parmi vous
    Oui tant qu'à faire, personne ne le fera mieux que toi
    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 averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Par défaut
    Merci pour vos réponses!
    Je viens de voir que (null) est elle aussi (ah bah ouais!) représentée dans la table ASCII et correspond à 0. Newbie que je suis je croyais que NULL est super puissante avec le pouvoir qu'elle a d'interrompre une chaîne de caractères, alors que ce n'est qu'un caractère parmi d'autres, le premier d'entre eux.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Achraf-A Voir le message
    je croyais que NULL est super puissante avec le pouvoir qu'elle a d'interrompre une chaîne de caractères, alors que ce n'est qu'un caractère parmi d'autres, le premier d'entre eux.
    Attention, ne confonds pas "NULL" (l'adresse 0) et '\0' (caractère de valeur ascii 0). Même si les valeurs numériques sont les mêmes, leur rôle n'est pas le même.

    La valeur "NULL" est une valeur servant à détecter l'échec de malloc(), de realloc(), de calloc(), de fopen() et de façon générale de toute fonction "critique" renvoyant une adresse.
    Le caractère '\0' est le caractère conventionnellement utilisé pour indiquer la fin d'une chaine.
    Ainsi, si une fonction cherche cette fin, elle cherchera '\0' et non pas NULL. Et si tu dois vérifier la réussite de fopen(), tu regarderas s'il est différent de NULL et pas de '\0'.

    Même si aujourd'hui les deux éléments ont la même valeur (et donc que tu pourrais permuter sans risque), ce n'est pas dit qu'il en sera de même demain. Et même si la probabilité que ça change est moins qu'infinitésimale, autant utiliser les bons outils au bon endroit...
    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]

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    D'ailleurs, un pointeur nul et un caractère nul n'ont généralement pas la même taille: L'un fait la taille d'un pointeur, l'autre la taille d'un caractère, et sur une architecture x86 32 bits on a sizeof(void*) == 4*sizeof(char).
    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.

  7. #7
    Nouveau candidat au Club
    Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    D'ailleurs, un pointeur nul et un caractère nul n'ont généralement pas la même taille: L'un fait la taille d'un pointeur, l'autre la taille d'un caractère, et sur une architecture x86 32 bits on a sizeof(void*) == 4*sizeof(char).
    Oui mais (juste pour rendre tout le monde perplexe :-) je rappelle que '\0' est de type int, pas char.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/03/2009, 11h03
  2. Réponses: 4
    Dernier message: 25/11/2008, 19h32
  3. [MySQL] Problème pour afficher une image dont le chemin est stocké dans la bdd
    Par cel.Saint-Louis dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2007, 08h49
  4. Réponses: 4
    Dernier message: 22/02/2007, 10h01
  5. [XSLT] Attribut dont le nom est stocké dans une variable ?
    Par Xfennec dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 15/03/2006, 11h20

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