c pointers comparison equality

== para la comparación del puntero



pointers comparison (5)

El operador de igualdad se define para todos los punteros válidos, y el único momento en que puede dar un "falso positivo" es cuando un puntero apunta a un elemento más allá del final de un conjunto, y el otro pasa al punto (o puntos en virtud de un definición de estructura) a otro objeto almacenado justo después de la matriz en la memoria.

Creo que tu error es tratar a K & R como normativo. Consulte el estándar C99 (buena versión html aquí: http://port70.net/~nsz/c/c99/n1256.html ), 6.5.9 en el operador de igualdad. El problema de que las comparaciones no se definan solo se aplica a los operadores relacionales (ver 6.5.8):

Cuando se comparan dos punteros, el resultado depende de las ubicaciones relativas en el espacio de direcciones de los objetos apuntados. Si dos punteros a objetos o tipos incompletos apuntan al mismo objeto, o ambos señalan uno pasado el último elemento del mismo objeto de matriz, se comparan iguales. Si los objetos apuntados son miembros del mismo objeto agregado, los punteros a los miembros de estructura declarados posteriormente comparan mayor que los punteros con los miembros declarados anteriormente en la estructura, y los punteros a los elementos de matriz con valores de subíndices más grandes comparan mayor que los punteros a elementos de la misma matriz con valores de subíndice más bajos Todos los apuntadores a miembros del mismo objeto de unión se comparan iguales. Si la expresión P apunta a un elemento de un objeto de matriz y la expresión Q apunta al último elemento del mismo objeto de matriz, la expresión de puntero Q + 1 se compara mayor que P. En todos los demás casos, el comportamiento no está definido.

Cito de "The C Programming Language" de Kernighan & Ritchie:

Cualquier apuntador se puede comparar significativamente para igualdad o desigualdad con cero. Pero el comportamiento no está definido para la aritmética o las comparaciones con punteros que no apuntan a miembros de la misma matriz. (Hay una excepción: la dirección del primer elemento más allá del final de una matriz se puede usar en la aritmética del puntero).

¿Esto significa que no puedo confiar en == para verificar la igualdad de punteros diferentes? ¿Cuáles son las situaciones en las que esta comparación conduce a un resultado incorrecto?


Lo interpreto de la siguiente manera:

short a[9]; int b[12]; short * c = a + 9;

Aquí es válido decir que

c > a

porque c resulta de a aritmética via puntero,

pero no necesariamente eso

b == c

o

c <= b

o algo parecido, porque resultan de diferentes matrices, cuyo orden y alineación en la memoria no está definido.


No puede usar la comparación de punteros para comparar punteros que apuntan a diferentes matrices.

Asi que:

int arr[5] = {1, 2, 3, 4, 5};

int * p = &arr[0];

int anotherarr[] = {1, 2};

int * pf = &anotherarr[0];

No se puede hacer if (p == pf) ya que p y pf no apuntan a la misma matriz. Esto conducirá a un comportamiento indefinido.

Puede confiar en la comparación de punteros si apuntan dentro de la misma matriz.

No estoy seguro acerca de la caja aritmética yo mismo.


Puede hacer == y != Con punteros de diferentes matrices.

<, <=,>,> = no está definido.


Un ejemplo que me viene a la mente es la arquitectura de Harvard con espacios de direcciones separados para el código y para los datos. En computadoras de esa arquitectura, el compilador puede almacenar datos constantes en la memoria de códigos. Dado que los dos espacios de direcciones están separados, un puntero a una dirección en la memoria del código podría ser numéricamente igual a un puntero en la memoria de datos, sin apuntar a la misma dirección.