¿Dónde en la memoria están los literales de cadena? pila / montón? [duplicate]

3 minutos de lectura

avatar de usuario
capa

Posible duplicado:

C String literales: ¿A dónde van?

Por lo que sé,

generalmente, malloc() tiene que asignar el puntero, y será asignado al montón, luego free();

y

el puntero no (int, char, float, etc.) se asignará automáticamente a la pila y no se asignará siempre que la función vaya a regresar

pero, del siguiente código:

#include <stdio.h>

int main()
{
char *a;

a = "tesaja";

return 0;
}

donde estara a asignado a ? pila o montón?

  • Posible duplicado de stackoverflow.com/questions/2589949/…

    – Alexander Gessler

    11 de febrero de 2011 a las 15:31

  • En su ejemplo, “tesaja” se llama cadena literal. El texto es constante, también conocido como de solo lectura, y se puede colocar en cualquier lugar. Podría colocarse en el área ejecutable. y copiado a la memoria grabable. La ubicación real depende de la configuración del compilador y la plataforma.

    – Thomas Matthews

    11 de febrero de 2011 a las 19:10

avatar de usuario
ulidtko

La cuerda literal será asignado en segmento de datos. El puntero a ella, ase asignará en la pila.

Eventualmente, el compilador transformará su código en algo como esto:

#include <stdio.h>

const static char literal_constant_34562[7] = {'t', 'e', 's', 'a', 'j', 'a', '\0'};

int main()
{
    char *a;

    a = &literal_constant_34562[0];

    return 0;
}

Por lo tanto, la respuesta exacta a su pregunta es: ninguno de los dos. Apilar, datos, bss y montón son todas diferentes regiones de la memoria. Las variables inicializadas estáticas constantes estarán en datos.

  • Quizás. Si los binarios en su plataforma tienen uno.

    – Flexografía

    11 de febrero de 2011 a las 15:31


  • @capede y no puntero (int, char, float, etc.) se asignará automáticamente a la pila Está Mal. Un puntero es una variable, un contenedor, y su tamaño depende del tamaño de una dirección de memoria. Su asignación (el puntero, no la dirección a la que apunta) sigue la misma regla que las otras variables, dependiendo de dónde se declaren.

    – Deja Vu

    11 de febrero de 2011 a las 15:56

  • @ring0: ¿qué quieres decir con where they're declared ? función interior y función exterior?

    – capa

    11 de febrero de 2011 a las 16:42

  • @capede sí, por ejemplo. Dentro de una función, un bloque, como parámetro, como variable global…, pero también como estática, como volátil… El compilador decide en cada caso cómo tiene que manejar la asignación de espacio variable.

    – Deja Vu

    11 de febrero de 2011 a las 16:52

  • @capede, realmente necesitar para escribir un programa en ensamblador. De esta forma entenderás muy bien la segmentación de la memoria.

    – ulidtko

    17 de mayo de 2011 a las 4:01

a sí mismo (el puntero) se define como una variable local (implícitamente) usando el auto clase de almacenamiento, por lo que se asigna en la pila (o cualquier memoria que use la implementación para la asignación similar a la pila; algunas máquinas, como los mainframes de IBM y los primeros Crays, no tienen una “pila” en el sentido normal).

El literal de cadena “tesaja” se asigna de forma estática. Exactamente dónde estará depende de la implementación: algunos lo colocan con otros datos y otros lo colocan en un segmento de datos de solo lectura. Algunos tratan todos los datos como de lectura/escritura y todo el código como de solo lectura. Como quieren que el literal de cadena sea de solo lectura, lo colocan en el segmento de código.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad