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 malloc
alloue 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 malloc
alloue 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 malloc
bon 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
Enregistrer un commentaire