c++ - que - lista de falsos cognados en ingles y español
Para un puntero p, ¿podría p<p+1 ser falso en un caso extremo? (5)
¿Es posible, para una variable de indicador p , que p <( p + 1 ) sea falso? Por favor explica tu respuesta. En caso afirmativo, ¿bajo qué circunstancias puede suceder esto?
Me preguntaba si p + 1 podría desbordarse y ser igual a 0.
Por ejemplo, en una PC de 64 bits con GCC-4.8 para un programa de lenguaje C:
int main(void) {
void *p=(void *)0xFFFFFFFFFFFFFFFF;
printf("p :%p/n", p);
printf("p+1 :%p/n", p+1);
printf("Result :%d/n", p<p+1);
}
Vuelve:
p : 0xffffffffffffffff
p+1 : (nil)
Result : 0
Entonces creo que es posible en este caso. Para una ubicación de puntero no válida, puede suceder. Esta es la única solución que puedo pensar. ¿Hay otros?
Nota: No se hacen suposiciones. Considere cualquier compilador / plataforma / arquitectura / sistema operativo donde haya una posibilidad de que esto pueda suceder o no.
¿Es posible, para una variable de indicador
p
, quep<(p+1)
sea falso?
Si p
apunta a un objeto válido (es decir, uno creado según el modelo de objetos C ++) del tipo correcto, entonces no. p+1
señalará la ubicación de la memoria después de ese objeto, y siempre comparará más que p
.
De lo contrario, el comportamiento de la aritmética y la comparación no están definidos, por lo que el resultado podría ser verdadero, falso o un sufijo de amarillo.
En caso afirmativo, ¿bajo qué circunstancias puede suceder esto?
Podría, o no, suceder con
p = reinterpret_cast<char*>(numeric_limits<uintptr_t>::max);
Si la aritmética del puntero funciona como la aritmética de enteros sin signo, esto podría causar un desbordamiento numérico de modo que p+1
tenga el valor cero y se compare con menos de p
. O podría hacer otra cosa.
¿Qué ocurre si estoy programando en DOS y tengo un puntero lejano (uno compuesto por un segmento y un desplazamiento) y está apuntando a la última dirección del segmento, le agregué uno y el puntero se ajusta ? Parece que cuando los comparas, normalizas los punteros, por lo que el segundo puntero p+1
sería menor que p
.
Sin embargo, esta es una puñalada en la oscuridad, no tengo un compilador DOS C práctico para probar.
Muy simple: no puede suceder si no hay un comportamiento indefinido involucrado. Puede suceder muy fácilmente en presencia de un comportamiento indefinido. Para más detalles, lea una copia del Estándar C o Estándar C ++.
Como resultado, se permite que un compilador conforme no evalúe el <operador en absoluto y use en su lugar 1 o verdadero como resultado. Lo mismo es cierto para la aritmética con enteros con signo (pero no para enteros sin signo, donde es posible que código completamente legal tenga x> x + 1).
Su código de ejemplo no es ni siquiera C o C ++, por lo que parece que ha utilizado el compilador en un modo en el que no es un compilador estándar de C o C ++.
Podría suceder con un puntero inválido.
Pero si el puntero apunta a una ubicación de memoria válida, en muchos sistemas operativos (por ejemplo, Linux), prácticamente nunca sucede (al menos si el sizeof(*p)
no es demasiado grande), porque en la práctica la primera y la última página del el espacio de direcciones nunca se correlaciona (pero puede forzar un mapeo con mmap
y MAP_FIXED
).
Para implementaciones independientes (es decir, dentro de un kernel, o en algún microcontrolador), las cosas son diferentes y específicas de la implementación (tal vez podría ser un comportamiento indefinido o un comportamiento no especificado ).
Según las comparaciones de Pointer en C. ¿Están firmados o no? en desbordamiento de pila:
No se pueden comparar legalmente punteros arbitrarios en C / C ++. El resultado de tal comparación no está definido.