2012-08-28 6 views
5

In c99, mein Verständnis ist, dass der Vergleich von zwei Zeigern, die nicht innerhalb der gleichen Aggregat zeigen, zu undefiniertem Verhalten führt. Gegeben ein Aggregat A, ein Zeiger p_good, von dem bekannt ist, dass er in A zeigt, und einen Zeiger p_unknown, der in A zeigen oder nicht zeigen kann, ist es möglich, einen tragbaren Test mit definiertem Verhalten zu konstruieren, der bestimmt, ob p_good und p_unknown?C99: Ist es möglich, portabel zu bestimmen, ob zwei Zeiger innerhalb desselben Aggregats zeigen?

Offensichtlich kann dieser Test nicht selbst in Konflikt mit den Einschränkungen beim Vergleichen von Zeigern fallen.

Ich vermute, dass die Antwort "Nein" ist, aber ich wäre glücklich, anders gezeigt zu werden.

+1

Was meinen Sie mit "Aggregat"? Und was genau willst du erreichen? –

+0

Haben Sie einen Zeiger auf 'A'? Oder nur zwei Zeiger, die auf "A" zeigen? –

+0

Ich denke "nein", aber immer noch, etwas wie "x> = y && x

Antwort

5

kommentiert:

Ein anderer Weg, um die Frage, wie das wäre zu gestalten: die Definition eines Aggregat ‚A‘ und ein Zeiger p gegeben ist es möglich, die Frage, ‚tut p Punkt zu beantworten innerhalb A‘ohne die Regel auf Ungleichheit Testen von Zeigern auf verschiedene Aggregate zu verletzen

die einzige Art, wie ich dies sinnvoll interpretieren kann, ist, dass Sie entweder ein Objekt vom Typ haben Aggregate type oder einen Zeiger auf ein. Dann ist die Antwort einfach:

Pseudo-Code:

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

Es gibt keine Möglichkeit zu sagen, ob ein Streu Zeiger auf ein unbekanntes Aggregate Objekt gehört (oder Punkte „zwischen“ Elementen in einem Aggregate).

+0

Ja, das macht Sinn. Ich stimme zu, dass es im Falle eines unbekannten Aggregats keine Möglichkeit gibt, dies zu tun, aber in meinem Fall weiß ich genug über A, um die iterierte Gleichheitsprüfung zu verwenden. Interessant, dass das Vermeiden der UB einen O (sizeof (A)) Algorithmus erfordert. – acm

+1

@acm, für eine Agreagiere unbekannten Typs, wo man nur den Basiszeiger und die Größe kennt, müsste man all dies auf einer Byte-Basis machen, indem man die Zeiger auf 'unsigned char *' wirft. –

+0

@JensGustedt Im motivierenden Fall kenne ich den Typ von A und es ist zufällig char [], also wird es ohne Casting funktionieren. – acm

Verwandte Themen