2012-08-28 13 views
5

En c99, tengo entendido que comparar dos punteros que no apuntan dentro del mismo resultado agregado en un comportamiento indefinido. Dado un agregado A, un puntero p_good que se sabe que apunta dentro de A, y un puntero p_conocido que puede apuntar o no dentro de A, es posible construir una prueba portátil con un comportamiento definido que determine si es seguro comparar p_good y p_unknown?C99: ¿Es posible determinar de manera portable si dos punteros apuntan dentro del mismo agregado?

Obviamente, esta prueba no puede en sí misma entrar en conflicto con las restricciones de la comparación de punteros.

Sospecho que la respuesta es 'no', pero estaría encantado de que se muestre lo contrario.

+1

¿Qué quiere decir con 'agregado'? ¿Y qué estás tratando exactamente de lograr? –

+0

¿Tiene un puntero a 'A'? ¿O solo dos punteros que apuntan a 'A'? –

+0

Creo que "no", pero aún así, algo como "x> = y && x

Respuesta

5

Ha comentado:

Otra forma de enmarcar la pregunta sería la siguiente: Teniendo en cuenta la definición de un agregado 'A' y un puntero p, es posible responder a la pregunta 'hace punto p dentro de un' sin violar la regla en las pruebas de la desigualdad de punteros a diferentes agregados

la única manera de que pueda interpretar esta significativa es que o bien tiene un objeto de tipo Aggregate type o un puntero a uno. Entonces la respuesta es sencilla:

pseudo-código:

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

No hay manera de saber si un puntero callejero pertenece a un objeto agregado desconocida (o puntos de "entre" elementos en un agregado).

+0

Sí, esto tiene sentido. Estoy de acuerdo en que no hay forma de hacerlo en el caso de un agregado desconocido, pero en mi caso sí sé lo suficiente sobre A para usar la verificación de igualdad iterada. Es interesante que evitar el UB requiere un algoritmo O (tamaño de (A)). – acm

+1

@acm, para un agregado de tipo desconocido donde solo conoces el puntero base y el tamaño que tendrías para hacer todo esto en una base de bytes lanzando tus punteros a 'unsigned char *'. –

+0

@JensGustedt En el caso motivador, sé el tipo de A, y resulta ser char [], por lo que funcionará sin conversión. – acm

Cuestiones relacionadas