Pointeur suivant renvoyé par malloc (0)

J’essaie de comprendre une partie du code. Je laisse de côté une grande partie du code afin de simplifier l’explication et d’éviter toute confusion inutile.

typedef void *UP_T; void FunctionC(void *pvD, int Offset) { unsigned long long int temp; void *pvFD = NULL; pvFD = pvD + Offset; temp = (unsigned long long int)*(int *)pvFD; } void FunctionB(UP_T s) { FunctionC(s, 8); } void FunctionA() { char *tempstorage=(char *)malloc(0); FunctionB(tempstorage); } int main () { FunctionA(); return 0; } 

Comme je l’ai dit, j’oublie une tonne de code, d’où les fonctions qui paraissent inutiles car elles ne comportent que deux lignes de code.

Quel est le temp ? C’est ce qui me trouble. Lorsque j’exécute quelque chose de similaire à ce code et que j’utilise des instructions printf() cours de route, je reçois un nombre aléatoire pour pvD , et pvFD est ce nombre aléatoire plus huit.

Mais, je pourrais aussi imprimer les valeurs de manière incorrecte (en utilisant %llu au lieu de %d ou quelque chose comme ça). Je suis presque sûr que c’est un pointeur sur l’emplacement en mémoire de tempstorage plus 8. Est-ce correct? Je veux juste être certain avant de continuer avec cette hypothèse.

La norme spécifie que malloc(0) renvoie NULL ou un pointeur valide, mais ce pointeur ne doit jamais être déréférencé. Il n’y a pas de contraintes concernant l’implémentation réelle, vous ne pouvez donc pas compter sur le pointeur renvoyé, qui est un autre plus 8.

C’est aléatoire dans le sens où malloc est généralement non déterministe (c.-à-d. Donne des résultats différents d’une exécution à l’autre).

Le résultat de malloc(0) est défini par l’implémentation (mais parfaitement valide), vous ne devriez donc jamais le déréférencer. Vous ne devriez pas non plus essayer de faire de l’arithmétique dessus (mais c’est généralement vrai; vous ne devriez pas utiliser l’arithmétique pour créer des pointeurs au-delà des limites de la mémoire allouée). Cependant, appeler free est toujours correct.