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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 10
    Points
    10
    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
    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 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 à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2014
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2014
    Messages : 13
    Points : 10
    Points
    10
    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
    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 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 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
    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 membre du 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
    Points : 26
    Points
    26
    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.

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    C'est décrit dans la norme C99 à la section 6.4.4.4 Character constants, au point 10 :
    An integer character constant has type int.
    Comme dit ici, les raisons sont historiques : http://publications.gbdirect.co.uk/c...constants.html
    Character constants actually have type int (for historical reasons).
    Sans doute pour pouvoir stocker des choses comme char a = 'bcd'; et pourquoi des raisons obscures liées au C pré-ANSI (voir #4 ici : http://bytes.com/topic/c/answers/222...rcter-variable)

  9. #9
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 451
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 451
    Points : 43 097
    Points
    43 097
    Par défaut
    la valeur 0 pour NULL me parait adapté, NULL étant utilisé avec des pointeurs, c'est à dire une adresse mémoire, l'accès à l'adresse 0 en mode protégé provoquera un SEGFAULT, comportement qu'il faut si on accède à un pointeur NULL. L'adresse 0 existe mais sera systématiquement occupé ou réservé par le système. Sur x86, la table des vecteurs d'interruptions se situe à l'adresse 0 pour le mode réel, et les CPU Intel démarrent toujours en mode réel, c'est l'OS qui les passe en mode protégé.

    Si une autre valeur que 0 était utilisé, celle-ci correspondrait une adresse physique. En remplaçant de 0, je penserais de prime-abord à -1, cependant , en langage machine le signe négatif est représenté par le bit de poids fort de l'octet ou du mot (ou double/quadruple mot) mis à 1. On parle d’arithmétique signé ou non signé. En arithmétique signé le bit de poids fort représente le signe et les valeurs possibles pour 32bits seront de -2 147 483 648 à +2 147 483 647, en arithmétique non signé les valeurs possibles seront de 0 à 4 294 967 295 et -1 en hexa 32 bits s'écrira FFFFFFFF

    Vu de C NULL veut dire indéfini, mais au niveau langage machine pointeur=NULL; sera traduit par eax=0; en supposant que le registre eax corresponde à la variable pointeur.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

+ 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