Aller au contenu

Null

Un article de Wikipédia, l'encyclopédie libre.
(Redirigé depuisNULL)

Null(nildans certains langages) est une valeur, une constante ou un mot clef présent dans de nombreuxlangages informatiques,et qui désigne l'état d'unpointeurqui n'a pas de cible ou d'unevariablequi n'a pas de valeur. La notion de valeur ou de pointeur NULL est en particulier présente dans les langagesCetC++(ainsi que dans plusieurs langages dont la syntaxe est proche, commeJava,JavaScript,PHP,etC#).

En termes de bases de données, ce mot clef exprime le fait que la valeur d'une donnée n'est pas connue. Il ne s'agit donc pas d'une valeur mais de l'état dans lequel la donnée se trouve, et signifie l'absence de valeur.

Il existe des équivalents nommés différemment:

  • Selon les langages,NULLs'écrit:NULL,Null,null;
  • Dans certains langages (Pascal,Lisp,Clos,Smalltalk,Ruby,Swift,Lua…), il est nomménil;
  • EnPython,l'équivalent deNULLestNone;
  • En C++11, la constante0ou la macro-constanteNULLsont dépréciées en faveur du mot-clefnullptr.

En C,NULLest défini dans plusieursfichiers d'en-têtede labibliothèque standard du C,notamment<stddef.h>,<stdlib.h>et<stdio.h>,et est uncastde 0 en void *[1],[2].

En C++,NULLest remplacé par la constante0,mais il est toujours possible d'utiliser une macro constanteNULLqui — à la différence de celle utilisée en C — ne doit pas être de type void* (les pointeurs vers des types différents étant incompatibles).

EnC++11,le mot clefnullptrest introduit pour remplacer la constante0et la macro-constanteNULL.

Voici un exemple de code montrant l'initialisation d'un pointeur àNULL,avant d'être utilisé pour stocker l'adresse d'une variable:

inta=2;// Déclaration de la variable a de type int (entier) et initialisée avec 2
int*p=NULL;// Déclaration d'un pointeur sur un int qui vaut NULL
p=&a;// L'adresse de a est affectée au pointeur p
*p=5;// p est déréférencé pour affecter 5 à la variable a

La valeur réellement utilisée comme pointeur nul par le processeur peut, sur certains systèmes, être différente de l’adresse spéciale 0; cela relève de la mécanique interne aux compilateurs[3].Cependant au niveau du C,NULLreprésente toujours un zéro, et doit être utilisé uniquement dans le but de désigner un pointeur qui ne pointe sur rien; en ce sens, parfois (et toujours en C++, où pointeurs et données sont clairement distincts), sa définition est agrémentée d'un type,((void*)0)ou((char*)0).

Différence avec NUL

[modifier|modifier le code]

Bien que cela ne pose généralement pas de problème de compilation en C (car une conversion implicite a lieu), le pointeur NULL ne doit pas être confondu avec lecaractèreASCIINUL(un seul L) correspondant à la constante littérale'\0'qui est utilisé pour marquer la fin d'unechaîne de caractèreset a sur la majorité des systèmes une taille d'unoctet(8 bits) plutôt que d'un mot (ex. 32 bits)[4]:

// Si l'on définit la constante NUL ainsi:
#define NUL '\0'

// Les deux chaînes suivantes sont équivalentes:
constcharstr1[]="Hello";
constcharstr2[]={'H','e','l','l','o',NUL};

constcharvide[]={NUL};// équivaut à "".
constchar*p=NULL;// p ne pointe sur rien.
p=vide;// p pointe vers le premier élément de la chaîne vide.
// Chaîne de caractères de longueur nulle: p[0] vaut NUL.

Lelangage Javane permet pas l'emploi de pointeur mais de références. Le mot clé null définit une référence nulle, c'est-à-dire ne désignant aucun objet en mémoire. Il s'agit de lavaleur par défautdes attributs de classe non initialisées de type référence d'objet.

Voici un exemple de code montrant l'initialisation d'une référence à null, avant d'être utilisée pour référencer un objet alloué:

Objectsource=null;// Déclaration d'une référence d'objet initialisée à null
source=newObject();// Maintenant référencer un objet alloué dynamiquement en mémoire

La libération mémoire en Java n'est pas explicite et se fait par leramasse-miettesqui tourne entâche de fondpour libérer périodiquement les objets qui ne sont plus référencés. Lors de la réallocation d'un tableau ou d'un objet très volumineux, il peut être utile de mettre une référence ànullavant d'allouer un nouveau tableau ou objet, dans le cas particulier d'une quantité de mémoire libre insuffisante, cela permet au ramasse-miettes de libérer la mémoire occupée par l'ancien objet pour allouer le nouveau.

int[]pixels=newint[1200*960];// Ce premier tableau remplit presque toute la mémoire disponible.
pixels=null;// Permettra au ramasse-miettes de libérer la mémoire avant la création du tableau de la ligne ci-dessous.
pixels=newint[1980*1080];// Ce nouveau tableau peut être créé, après la suppression du premier.

En php, une variable de valeur NULL est considérée comme non-définie:

<?php
$a=NULL;

if(isset($a)){
echo'$a est définie';
}else{
echo'$a est indéfinie';
}

if(is_null($a)){
echo'$a est NULL';
}else{
echo'$a n\'est pas NULL';
}

if(isset($b)){
echo'$b est défini';
}else{
echo'$b est indéfini';
}

if(is_null($b)){
echo'$b est NULL';
}else{
echo'$b n\'est pas NULL';
}

Affiche: $a est indéfinie. $a est NULL $b est indéfini $b est NULL

NULL, Typage et Méta-modélisation

[modifier|modifier le code]

Soient deux types A et B distincts (et sans rapport)

A a = null;
B b = null;

La modélisation correcte d'un système de types rendant ces deux affections valables implique que null pos sắc de un type sous-type union de A et B:None. Noneest un type singleton ayant comme seule valeur possiblenulldéfini comme l'union de tous les types du programme. Comme ce type n'est pas modélisable sans une forme spéciale du langage et que son utilité est limitée (il n'accepte qu'une seule valeur,null), peu de langages àtypage statiquele proposent.

Si on s'intéresse aux langages à objets, et qu'on pose comme première approximation du système de type:

type = classe

Alors la classe de null (étrangement tous ces langages utilisent plutôt la formenil) devient la classe singletonNone,sous-classe de toutes les classes ayant pour seule instancenull.Pour garantir un fonctionnement cohérent avec le comportement des envois de messages sur null, toutes ces méthodes doivent être redéfinies par l'envoi d'une exceptionNullPointerException.

Bien qu'en théorie la valeurnullpuisse être quelconque, en pratique tous les langages utilisent la valeur 0. Cette valeur est non adressable et toute tentative d'accès provoque uneerreur de segmentation.Si l'on veut proprement lever une exception, on doit protéger tous les envois de messages par un test ànull.Un bon compilateur ne génèrera pas ces tests dans les cas où le receveur est trivialement nonnull(cas desself,this,superet autres) et dans certains autres cas.

Périphérique nul

[modifier|modifier le code]

Dans les systèmesUNIX,/dev/nullest un fichier spécial qui détruit immédiatement toutes les données qui lui sont envoyées. Pour cette raison, ce fichier est appelé le « trou noir » ou encore la « poubelle ».

Les systèmes d'exploitationMicrosoftutilisent un fichier spécial appeléNUL:et plus récemmentNUL.

Articles connexes

[modifier|modifier le code]

Sur les autres projets Wikimedia: