2012-08-28 10 views
5

Nel c99, la mia comprensione è che confrontando due puntatori che non puntano all'interno dello stesso risultato aggregato nel comportamento non definito. Dato un aggregato A, un puntatore p_good che è noto per puntare all'interno di A, e un puntatore p_unknown che può o meno puntare all'interno di A, è possibile costruire un test portatile con un comportamento definito che determina se è sicuro confrontare p_good e p_unknown?C99: è possibile determinare in modo portabile se due puntatori puntano all'interno dello stesso aggregato?

Ovviamente, questo test non può a sua volta cadere in contrasto con le restrizioni sul confronto dei puntatori.

Sospetto che la risposta sia "no", ma sarei felice di essere mostrato diversamente.

+1

Cosa intendi per "aggregato"? E cosa stai cercando esattamente di raggiungere? –

+0

Hai un puntatore a 'A'? O solo due puntatori che puntano in 'A'? –

+0

Penso "no", ma comunque, qualcosa come "x> = y && x

risposta

5

È commentato:

Un altro modo per inquadrare la questione sarebbe come questo: Considerata la definizione di un aggregato 'A' e un puntatore p, è possibile rispondere alla domanda 'fa punto p all'interno a' senza violare la regola sui test disuguaglianza di puntatori a diversi aggregati

l'unico modo che posso interpretare questo significato è che hai i un oggetto di tipo Aggregate type o un puntatore a uno. Allora la risposta è semplice:

pseudo-codice:

bool p_in_A = false; 
for (each element in Aggregate A) 
    if (&element == p) 
     p_in_A = true; 

Non v'è alcun modo per indicare se un puntatore vagante appartiene a un oggetto aggregato sconosciuta (o punti di "tra" elementi in un aggregato).

+0

Sì, questo ha senso. Sono d'accordo che non c'è modo di farlo nel caso di un aggregato sconosciuto, ma nel mio caso conosco abbastanza A per usare il controllo di uguaglianza iterato. È interessante notare che evitare l'UB richiede un algoritmo O (sizeof (A)). – acm

+1

@acm, per un agreagate di tipo sconosciuto in cui si conosce solo il puntatore di base e la dimensione si dovrebbe fare tutto questo su una base di byte, gettando i puntatori su 'unsigned char *'. –

+0

@JensGustedt Nel caso motivante, conosco il tipo di A, e capita che sia char [], quindi funzionerà senza casting. – acm

Problemi correlati