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

La fonction GCP Cloud pour écrire des données dans BigQuery s'exécute avec succès, mais les données n'apparaissent pas dans la table BigQuery

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

Le shell POSIX (sh) redirige stderr vers stdout et capture stderr et stdout dans des variables