Initialisation de la variable à l’adresse zéro en C

C’est peut-être une question assez fondamentale. Je comprends qu’il existe une convention C pour définir la valeur des pointeurs nuls à zéro. Est-il possible que vous puissiez jamais allouer de l’espace pour une nouvelle variable dans Windows et que l’adresse de cet espace alloué se trouve être zéro? Si non, qu’est-ce qui occupe habituellement cette région d’adresse?

    Sur MS-DOS, le pointeur null est un pointeur assez valide et, du fait que le système d’exploitation fonctionnait en mode réel, il était en fait possible de remplacer l’adresse 0x0 par un garbage et de corrompre le kernel. Vous pourriez faire quelque chose comme:

    int i; unsigned char* ptr = (unsigned char *)0x0; for(i = 0; i < 1024; i++) ptr[i] = 0x0; 

    Les systèmes d'exploitation modernes (Linux, Windows, par exemple) fonctionnent en mode protégé, ce qui ne vous permet jamais d'accéder directement à la mémoire physique.

    Le processeur mappera les adresses physiques sur les adresses virtuelles que votre programme utilisera.

    Il garde également une trace de ce que vous accédez et osez toucher quelque chose qui ne vous appartient pas, vous serez en difficulté (votre programme segfault ). Cela inclut très certainement d'essayer de déréférencer l'adresse 0x0.

    Lorsque vous “définissez la valeur d’un pointeur sur zéro” comme dans

     int *p = 0; 

    cela ne finira pas nécessairement par indiquer l’adresse physique zéro, comme vous semblez le croire. Lorsqu’un pointeur se voit atsortingbuer une valeur zéro constante (ou l’initialise avec celle-ci), le compilateur est tenu de reconnaître cette situation et de la traiter de manière particulière. Le compilateur est tenu de remplacer ce zéro par une valeur de pointeur nul dépendant de la mise en œuvre . Ce dernier ne pointe pas nécessairement vers l’adresse zéro.

    La valeur du pointeur NULL est supposée être représentée par une adresse physique qui ne sera utilisée à aucune autre fin. Si, dans certaines implémentations, l’adresse physique zéro est une adresse utilisable, cette implémentation devra utiliser une adresse physique différente pour représenter les pointeurs nuls. Par exemple, certaines implémentations peuvent utiliser l’adresse 0xFFFFFFFF à cette fin. Dans une telle implémentation, l’initialisation

     int *p = 0; 

    va réellement initialiser p avec 0xFFFFFFFF physique, pas avec zéro physique.

    PS Vous voudrez peut-être consulter la FAQ: http://c-faq.com/null/index.html , qui est principalement consacrée à ce problème.

    La valeur 0 n’a pas de signification particulière. C’est une convention pour définir un pointeur sur 0 et le compilateur C doit l’interpréter en conséquence. Cependant, il n’y a pas de connexion à l’adresse physique 0 et en fait, cette adresse peut être une adresse valide. Dans de nombreux systèmes, les adresses inférieures contiennent des adresses liées au matériel, comme des vecteurs d’interruption ou autres. Sur Amiga, par exemple, l’adresse 4 était le point d’entrée dans le système d’exploitation, ce qui constitue également une décision arbitraire.

    Si l’adresse de l’espace alloué est zéro, la mémoire disponible est insuffisante. Cela signifie que votre variable n’a pas pu être allouée.

    L’adresse à 0x0 est l’endroit où la CPU commence à s’exécuter lorsque vous l’allumez. Habituellement, à cette adresse, il y a un saut vers le code du BIOS et le IIRC, les premiers 64 Ko (ou plus) sont réservés pour d’autres tâches (déterminées par le BIOS / UEFI). C’est un domaine qui n’est pas accessible à une application.

    Étant donné qu’il devrait être clair que vous ne pouvez pas avoir une variable à l’adresse 0x0 dans Windows.