Storia della domanda: Nel linguaggio C, i puntatori sono variabili che memorizzano indirizzi di altri oggetti. È emerso un problema: come confrontare tali valori, visto che la memoria può essere distribuita in modo imprevedibile. Il linguaggio consente l'operazione di confronto tra puntatori, ma impone una serie di restrizioni affinché il comportamento rimanga definito.
Problema: È corretto confrontare tra loro solo puntatori a elementi dello stesso array o a uno stesso oggetto. Il confronto di puntatori che puntano a oggetti non correlati (variabili diverse o aree di memoria allocate che non appartengono allo stesso array) è un comportamento indefinito (undefined behavior).
Soluzione: Occorre evitare il confronto di puntatori tra aree di memoria non correlate, utilizzarli solo all'interno dello stesso array/stringa/buffer, e il confronto con NULL è sicuro.
Esempio di codice:
#include <stdio.h> int main() { int arr[5] = {1, 2, 3, 4, 5}; int *p1 = &arr[1]; int *p2 = &arr[3]; if (p1 < p2) { printf("p1 punta a un elemento precedente dell'array rispetto a p2\n"); } }
Caratteristiche chiave:
1. È possibile confrontare puntatori ottenuti tramite malloc che puntano a diverse aree di memoria?
No, confrontare tali puntatori non è consentito: il comportamento non è definito dal standard. È consentito confrontare solo puntatori che puntano allo stesso blocco di memoria allocato o con NULL.
2. Cosa restituisce il confronto tra puntatori di tipo int e double, se puntano a variabili diverse ma hanno lo stesso valore numerico?**
Il confronto è possibile solo se entrambi i puntatori sono castati allo stesso tipo e puntano allo stesso oggetto. Se ciò non avviene, il risultato non è definito: gli indirizzi potrebbero avere valori identici, ma il standard non garantisce questo comportamento.
3. È corretto confrontare un puntatore al primo elemento di un array con un puntatore alla sua fine (ad esempio, arr e arr + N)?
Sì, è corretto. arr + N punta a un elemento immaginario che segue l'ultimo, e il compilatore garantisce che arr <= arr + N.
Un dipendente ha deciso di implementare una funzione di confronto degli indirizzi per determinare "chi è stato creato prima" tra due strutture allocate in diverse porzioni di memoria.
Vantaggi:
Svantaggi:
Dopo la revisione, è stata implementata una verifica dell'appartenenza dei puntatori a un unico blocco di memoria mediante l'allocazione di tutte le strutture in un buffer comune e il successivo confronto nei limiti consentiti.
Vantaggi:
Svantaggi: