2010-11-19 8 views
5

En C, tenga en cuenta los siguientes "en línea" matrices de cadenas:¿Están las matrices de cadenas en línea en C asignadas en la pila?

char *string1 = "I'm a literal!"; 
char *string2 = malloc((strlen(string1) + 1) * sizeof(char)); 
//Do some string copying 
... 
char string3[] = {'a','b','c','\0'}; 
char *stringArray[] = {string1, string2, string3}; 

Would stringArray contienen simplemente una copia de cada uno de los tres punteros?

¿Se asignaría la matriz en la pila?

+0

Nota: 'string3' no tiene terminación nula. No intente usar 'str (n) len' en él. – nmichaels

+0

Gracias Nathon! Lo arreglé – Joel

Respuesta

9

El stringArray se asigna en la pila, cada uno de su elemento es un puntero a una char. Para ser más específicos:

  • string1 puntero está en la pila, su valor es la dirección del primer carácter de una cadena de sólo lectura en el segmento de datos
  • string2 puntero está en la pila, su valor se la dirección de un bloque de memoria asignada en el montón
  • string3 es una matriz que ocupa 4 * sizeof(char) bytes en la pila
  • stringArray es una matriz que ocupa 3 * sizeof(char *) bytes en la pila.
+0

Ninguno de los elementos son punteros a una matriz 'char', sino más bien de tipo' char * ', es decir, apunta a' char'. –

+0

@eq por supuesto, gracias por señalar (hum) que fuera – icecrime

+0

En realidad, string3 tendría 4 * sizeof (char) (es decir, un byte más para el nulo). –

0

Suponiendo que su fragmento de código es parte de una función (y parece que lo es, ya que "hace algo de copia de cadenas"), entonces sí, todo menos el almacenamiento de string2 (ya que es malloc() ed) estar en la pila.

+4

Falso. '" Soy literal "' tampoco está asignado en la pila. Generalmente está en '.data'. – nmichaels

+0

@ Nathan: gracias, yo no sabía eso. –

1

Sí (contiene copias de los punteros (ver más adelante)), y sí (la matriz está en la pila).

(string3 no es un puntero, sino una matriz).

+1

Sin votos para usted: ¡está en 666 representantes! – nmichaels

Cuestiones relacionadas