Confusion de pointeur en C

#include <stdio.h>
#include <stdlib.h>
int main()
{
int a = 4;
int *p = malloc(sizeof(int) * a);
int *g = malloc(sizeof(int) * a);
p += 8;
printf("%p\n", p);
printf("%p\n", g);

}

J'ai exécuté ce programme plusieurs fois, et à chaque fois les valeurs de p et g imprimées à la fin sont les mêmes. Je ne sais pas trop pourquoi cela se produit - malloc ne pourrait-il théoriquement pas choisir n'importe où dans la mémoire pour faire pointer p et g? Pourquoi p + 8 est-il toujours égal à g? Toute clarification serait très appréciée.

Merci!


Solution du problème

J'ai exécuté ce programme plusieurs fois, et à chaque fois les valeurs de p et g imprimées à la fin sont les mêmes

C'est à cause de la façon dont votre mémoire a été allouée.

Le premier mallocalloue de la mémoire pour 4 entiers. Disons qu'ils sont 4 octets chacun donc 16 octets.

0 1 2 3 
0123456789abdef0123456789abdef0123456789abdef0123456789abdef
^--------------
p

Le second mallocalloue de la mémoire pour 4 autres entiers. Cette mémoire pourrait être allouée dans n'importe quel emplacement libre, mais il se trouve que c'est comme ça.

0 1 2 3 
0123456789abdef0123456789abdef0123456789abdef0123456789abdef
^-------------- ^--------------
p g

Si vous ajoutez 8 à p, cela le déplace de la taille de 8 entiers, 32 octets, soit g.

Qu'y a-t-il dans la mémoire dans l'écart? Qui sait. La mémoire peut être allouée comme mallocbon vous semble.

Cependant, rien ne garantit que la mémoire sera allouée de cette manière. Sur mon système p += 4, cela signifie qu'il n'y a pas d'écart.

Commentaires

Posts les plus consultés de ce blog

Erreur Symfony : "Une exception a été levée lors du rendu d'un modèle"

Détecter les appuis sur les touches fléchées en JavaScript

Une chaîne vide donne "Des erreurs ont été détectées dans les arguments de la ligne de commande, veuillez vous assurer que tous les arguments sont correctement définis"