¿Dónde en la memoria están los literales de cadena? pila / montón? [duplicate]
⏰ 3 minutos de lectura
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
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:
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?
Tu feedback nos ayuda a saber si la solución es correcta y está funcionando. De esta manera podemos revisar y corregir el contenido.
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
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