2017-01-08 1 views
0

Je me demande pourquoi mon allocation fonctionne. J'ai créé ptr qui est un pointeur et ptr2 avec un pointeur sur le même emplacement que ptr.malloc touchant la mémoire non allouée

Voici mon code:

int* ptr = malloc(sizeof(int)); 
int* ptr2 = ptr; 
*ptr2 = 1; 
ptr2 = ptr+1; 
*ptr2 = 2; 

A la fin j'ai un tableau de deux entiers comme ça:

ptr[0] = 1 
ptr[1] = 2 

Ma question est: pourquoi je peux affecter la valeur 2-ptr2 sans erreur ou avertissements? Je seulement malloc() -ed pour un endroit entier dans mon tableau, n'est-ce pas?

+2

Le comportement non défini est * undefined *. – EOF

+1

Copie possible de [Pas d'erreur hors limites] (http://stackoverflow.com/questions/9137157/no-out-of-bounds-error) – EOF

+0

Copie possible de [Accède à un tableau global en dehors de son comportement indéfini lié? ] (http://stackoverflow.com/questions/26426910/is-accessing-a-global-array-outside-its-bound-undefined-behavior) –

Répondre

4

Le problème est ici, en disant

ptr2 = ptr+1; 

vous pointez sur la mémoire liée. Ensuite, lors de la dérivation, vous appelez undefined behavior. Maintenant, le résultat de UB ne peut être justifié, en aucune façon.

Il n'y a rien d'inhérent dans C que vous empêche d'accéder à la mémoire hors limite (ou invalide), mais le résultat de cette opération est UB.

Cela dit, juste une suggestion, vous devriez toujours vérifier la valeur retournée de malloc() avant d'utiliser ce pointeur pour éviter UB par déréférencement pointeur NULL, en cas de défaillance malloc().

+0

Merci pour votre réponse. Donc, si je veux l'améliorer, je peux utiliser quelque chose comme 'realloc'? –

+0

@CallisteHanriat C'est la bonne façon de faire. –