Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

92
Vistas
matrices consecutivas

Tengo curiosidad acerca de una oración en el estándar C18:

Dos punteros se comparan igual si y solo si ambos son punteros nulos, ambos son punteros al mismo objeto (incluido un puntero a un objeto y un subobjeto al principio) o función, ambos son punteros a uno más allá del último elemento de la misma matriz o uno es un puntero a uno más allá del final de un objeto de matriz y el otro es un puntero al inicio de un objeto de matriz diferente que sigue inmediatamente al primer objeto de matriz en el espacio de direcciones. § 6.5.9 6

¿Por qué el objeto que sigue a la matriz tiene que ser necesariamente otra matriz? ¿No podría ser simplemente un objeto del mismo tipo que el tipo base de la matriz (como un int inmediatamente después de un int[] )?

No es de extrañar que haya probado este código:

 #include <stdio.h> struct test { int arr[10]; int i; }; int main() { struct test t; int *p, *q; p = t.arr + 10; q = &t.i; if (p == q) printf("Equal pointers."); return 0; }

Y produce punteros iguales. ¿Este comportamiento no está garantizado en absoluto, solo es una coincidencia definida por la implementación?

over 4 years ago · Santiago Trujillo
3 Respuestas
Responde la pregunta

0

La palabra clave en el estándar es 'o'.

Dos punteros se comparan iguales si y solo si ambos son punteros nulos, ambos son punteros al mismo objeto (incluido un puntero a un objeto y un subobjeto al principio) o función, ambos son punteros a uno más allá del último elemento de la misma matriz o uno es un puntero a uno más allá del final de un objeto de matriz y el otro es un puntero al inicio de un objeto de matriz diferente que sigue inmediatamente al primer objeto de matriz en el espacio de direcciones.

Si tiene una matriz seguida de una estructura en el espacio de direcciones, los compiladores diseñarían la matriz y luego alinearían el inicio de la estructura en un límite de palabra, no inmediatamente después de la matriz. En este caso, no se garantiza que los punteros sean iguales. En la mayoría de las arquitecturas, no serán iguales.

La razón para mencionar la matriz como una restricción es porque las matrices pueden contener cualquier cosa: std::byte, char, int, long, double, etc. Si una operación de desreferenciación de un puntero tendrá éxito o no, depende de lo que se esté apuntando y accedido Si toma un puntero a un byte específico en la memoria y lo desreferencia como largo, si no está alineado en un límite de palabra, obtendrá una falla de segmentación. Si lo está desreferenciando como char o std::byte, tendrá éxito. Al puntero no le importa esto, pero la persona que llama que lo desreferencia debe hacerlo. Tenga en cuenta que los punteros se pueden convertir en diferentes tipos antes de desreferenciarlos.

Esta es la razón por la que el estándar incluye específicamente array.

Como han señalado otros, la primera parte de la condición de igualdad de puntero en el estándar ayuda a implementar iteradores, accesos a matrices, iterador::begin(), iterador::end(), etc.

over 4 years ago · Santiago Trujillo Denunciar

0

En primer lugar, especificar una matriz aquí no excluye/prohíbe un solo objeto. Un solo objeto en la memoria es indistinguible de una matriz de tamaño 1.

( Editar : lea esta respuesta para una cita del estándar que establece esto explícitamente cuando se refiere a punteros)

En segundo lugar, la norma también trata de aclarar la declaración que ha citado, con la siguiente nota al pie que indica los escenarios en los que se aplica la regla:

Dos objetos pueden ser adyacentes en la memoria porque son elementos adyacentes de una matriz más grande o miembros adyacentes de una estructura sin relleno entre ellos, o porque la implementación eligió colocarlos así, aunque no estén relacionados.

Poniéndolo todo junto, lo que el estándar intenta decir aquí es que, en general, dos punteros a objetos diferentes no deben compararse iguales. Sin embargo, dado que es legal apuntar uno más allá de un objeto de matriz en la memoria, si resulta que hay un objeto (matriz) diferente en esa ubicación, aún es legal que dicho puntero se compare igual a un puntero al objeto adyacente. Ahora, puede haber o no un objeto válido en esta ubicación, debido a las opciones de alineación y el relleno, pero si hay uno, es aceptable que estos punteros se comparen como iguales.

En su ejemplo, si cambié la matriz a un carácter, los punteros probablemente se compararían de manera desigual porque el compilador elegiría alinear el int a 4 bytes (en la mayoría de las plataformas de 32 o 64 bits), introduciendo así el relleno. Este comportamiento sigue siendo legal según la norma.

 #include <stdio.h> struct test { char arr[10]; int i; }; int main() { struct test t; int *p, *q; p = (int*)(t.arr + 10); q = &t.i; if(p == q) printf("Equal pointers."); else printf("Unequal pointers."); return 0; }
over 4 years ago · Santiago Trujillo Denunciar

0

OP: ¿Por qué el objeto que sigue a la matriz tiene que ser necesariamente otra matriz?

No es asi. "... comienzo de una matriz diferente ..." es una simplificación. La siguiente especificación es:

A los efectos de estos operadores, un puntero a un objeto que no es un elemento de una matriz se comporta igual que un puntero al primer elemento de una matriz de longitud uno con el tipo del objeto como su tipo de elemento. C17dr § 6.5.9 7


OP: ¿No podría ser simplemente un objeto cuyo tipo era el mismo que el tipo base de matriz (como un int inmediatamente después de un int[] )?

Si.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda