son que los lista ingles falsos español cognates cognados c++ c pointers pointer-arithmetic

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 , que p<(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.