Pourquoi mon programme ne fait-il pas défaut lorsque je déréférence un pointeur NULL à l’intérieur de malloc?

J’utilise ce style malloc tout le temps

int *rc = 0; rc = malloc(sizeof(*rc)); 

Cependant, cela ne marque pas l’erreur même si, quand j’appelle sizeof(*rc) je suppose que rc==0 et que je déréférence un pointeur NULL .

Vous ne déréférencez vraiment rien. L’argument de sizeof n’est pas évalué, sauf s’il s’agit d’un VLA. Il est explicitement autorisé par le langage de mettre n’importe quel “déchet” comme argument de sizeof . Le langage garantit qu’il n’évaluera rien, il vous suffit d’effectuer une parsing au moment de la compilation du type de l’expression. Par exemple, il est garanti que l’expression sizeof i++ ne modifie pas la valeur de i .

La seule exception à cette règle concerne les tableaux de longueur variable. Le résultat de sizeof pour les VLA est une valeur d’exécution, ce qui signifie que l’argument est évalué et doit être valide.

L’opérateur sizeof n’évalue pas réellement son opérande, il ne regarde que son type. Le type de *rc est int , il est donc équivalent à sizeof (int) . Tout cela se passe au moment de la compilation.

(En outre, ce n’est pas “à l’intérieur du malloc”.)

Vous ne déréposez pas réellement un pointeur, vous demandez au compilateur la taille du type rc . Dans ce cas, sizeof est résolu au moment de la compilation, lorsqu’il n’y a pas de pointeur.

Cela équivaut à sizeof(type of *rc) (autrement dit, sizeof(int) ), et non à sizeof(data stored at the location pointed to by rc) . sizeof() fonctionne sur des types , pas des valeurs.

sizeof ne considère jamais les données réelles, mais seulement le type, il n’y a donc pas besoin (et cela n’aurait aucun sens) de déférencer le pointeur.