2011-06-01 12 views
11

Am mirar el siguiente programa y no está seguro de cómo se asigna la memoria y por qué:montón vs segmento de datos vs asignación de pila

void function() { 
    char text1[] = "SomeText"; 
    char* text2 = "Some Text"; 
    char *text = (char*) malloc(strlen("Some Text") + 1); 
} 

En el código anterior, el último es, obviamente, en el montón. Sin embargo, como entiendo, text2 está en el segmento de datos del programa y text1 puede estar en la pila. ¿O es errónea mi suposición? ¿Cuál es la suposición correcta aquí? ¿Es este compilador dependiente?

Gracias

+1

1: pregunta muy intersting – Heisenbug

+0

¿entiende la diferencia entre el puntero y los datos que señala? – n0rd

+0

Sí n0rd, sin embargo, este me impactó, ya que parece que este tiene múltiples opciones posibles. – Kiran

Respuesta

16
// Array allocated on the stack and initialized with "SomeText" string. 
// It has automatic storage duration. You shouldn't care about freeing memory. 
char text1[] = "SomeText"; 

// Pointer to the constant string "Some Text". 
// It has static storage duration. You shouldn't care about freeing memory. 
// Note that it should be "a pointer to const". 
// In this case you'll be protected from accidential changing of 
// the constant data (changing constant object leads to UB). 
const char* text2 = "Some Text"; 

// malloc will allocate memory on the heap. 
// It has dynamic storage duration. 
// You should call "free" in the end to avoid memory leak. 
char *text = (char*) malloc(strlen("Some Text") + 1); 
+1

¿Qué sucede si descartas la constness de 'text2' e intentas modificarla? ¿Esto es un segfault? –

+0

Sí. Eso daría como resultado una segfault. – Jagannath

+1

@DrewNoakes es un comportamiento indefinido. Podría ser segfault, pero no puedes contar con eso. –

5

Sí tienes razón, en la mayoría de los sistemas:

text1 será una matriz de variables se puede escribir en la pila (se requiere para ser una matriz grabable)

text2 ha ser const char* en realidad, y sí, apuntará a un segmento de texto del ejecutable (pero eso podría cambiar en los formatos ejecutables)

text habrá en el montón

Cuestiones relacionadas