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

149
Vistas
Asignación de memoria y byte no utilizado en el programa C básico

Tengo una pregunta sobre la asignación de memoria en el programa C básico.

 #include <stdio.h> int main() { int iarray[3]; char carray[3]; printf("%p\n", &iarray); // b8 printf("%p\n", &iarray+1); // c4 printf("%p\n", &carray); // c5 return 0; }

dado el código anterior, puede ver que &iarray+1 y &carray tienen una diferencia de un byte que no estoy seguro para qué propósito o qué contiene, ¿por qué el compilador asigna un byte no utilizado entre las dos matrices?

Pensé que tal vez se usa para conocer el tamaño de la matriz, pero entendí que sizeof es una función de tiempo de compilación que conoce el tamaño sin asignación de memoria real, por lo que no sirve para almacenar el tamaño de la matriz

Nota: La salida se puede ver en los comentarios de cada printf .

 b8 c4 c5

Zona de juegos: https://onlinegdb.com/cTdzccpDvI

Gracias.

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

0

Los compiladores son libres de organizar las variables en la memoria de la forma que consideren adecuada. Por lo general, se colocarán en compensaciones de memoria cuyo valor es un múltiplo del tamaño de la variable, por ejemplo, una matriz int o int de 4 bytes comenzará en una dirección que es un múltiplo de 4.

En este caso, tiene una matriz int que comienza en una dirección que es un múltiplo de 4, seguida de un byte no utilizado, seguida de una matriz char de tamaño 3. En teoría, un int o long podría seguir inmediatamente a la matriz char en la memoria. si se definió como la próxima dirección disponible es un múltiplo de 8.

over 4 years ago · Santiago Trujillo Denunciar

0

Según su salida, parece que la pila está organizada de esta manera para estas variables locales:

 b8-bb: 1st integer of iarray bc-bf: 2nd integer of iarray c0-c3: 3rd integer of iarray c4: padding probably, only compiler knows c5-c7: carray

Ahora, cuando haces &iarray+1 , estás tomando la dirección de una matriz int[3] y agregando +1 de ese tipo de matriz . En otras palabras, está obteniendo la dirección de la siguiente matriz int[3] , que de hecho estaría en c4 (pero no lo está porque solo hay un int[3] ).

Este código es realmente válido. No debe quitar la referencia a este puntero, pero debido a que apunta exactamente +1 más allá de iarray , tener el puntero e imprimir su valor es legal (en otras palabras, no un comportamiento indefinido, como lo &iarray+2 ).

Si también imprimes esto:

 printf("%p\n", iarray+1);

Debería obtener el resultado bc , porque ahora toma un puntero de tipo int ( iarray se trata como un puntero a int ), agrega 1 a eso, obteniendo el siguiente int .

over 4 years ago · Santiago Trujillo Denunciar

0

Este comportamiento está definido puramente por la implementación (compilador). Lo que probablemente pase es esto:

Cuando se invoca una función ( main() en este caso) que tiene variables locales, la memoria para esas variables se asigna en la pila. En este caso, se necesitan 15 bytes, pero es probable que se requiera una alineación de 4 bytes para la asignación de la pila, por lo que se asignan 16 bytes.

También es probable que int -array deba estar alineado en 4 bytes. Por lo tanto, la dirección de la matriz int es un múltiplo de 4. La matriz char no tiene ningún requisito de alineación, por lo que puede colocarse en cualquier lugar de los 4 bytes restantes.

En resumen, el byte adicional no se usa, pero se asigna debido a la alineación.

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