2010-06-24 14 views
13

¿Dónde están punteros y variables globales almacena en C? ¿Se guardan en la memoria, en el montón o en la pila?Ubicación de punteros y variables globales en C

+3

por qué se consideran punteros aparte; después de todo, un puntero es una variable ... – ShinTakezou

+0

¿Quizás no quiso decir los punteros sino los objetos a los que apuntan los punteros? –

+0

Sí, eso es lo que quiero decir, los objetos que apuntan por los punteros, no los punteros, ya que son solo variables locales (en su mayoría) las que se ponen en la pila. –

Respuesta

22

Las variables globales pueden estar en un par de lugares, dependiendo de cómo estén configuradas; por ejemplo, const globales pueden estar en una sección de solo lectura del archivo ejecutable. Los valores globales "normales" se encuentran en una sección de lectura y escritura del ejecutable. No están en el montón o la pila en absoluto. Los punteros son solo un tipo de variable, por lo que pueden estar donde quiera que estén (en el montón si los malloc() ellos, en la pila si son variables locales, o en la sección de datos si son globales).

+0

"en el montón si malloc" El puntero apunta al montón y no ese puntero tiene su dirección en el montón ¿no? –

+0

No, el puntero también puede estar en el montón. Es solo una variable. –

+0

Bien. Eso es cierto, solo que la declaración es un poco ambigua en la primera lectura. Para ser claros {// un bloque int ** p = (int **) malloc (sizeof (int *);. // Aquí puntero * p es en el montón, pero p es en la pila int * p = (int *) malloc (sizeof (int); // Aquí p es un puntero y está en la pila y apuntando a un lugar montón } –

6

Las variables globales generalmente se almacenan en el segmento de datos de la aplicación.

Los punteros no se almacenan de forma diferente que otras variables (por ejemplo, si tiene una variable local de tipo int*, se almacenará en la pila, al igual que cualquier otra variable local).

-2

La memoria a través de malloc() está tomada del montón. Esto proporciona un puntero a la memoria.

Más información here.

+0

Esta respuesta no está relacionada con lo que el usuario solicitó en primer lugar, no se habla.. acerca de las variables globales. Luego, viene aquí para hablar sobre 'malloc()', y este no es el punto aquí. Los punteros no están relacionados con 'malloc()', puede perfectamente tener puntero apuntando a una dirección de pila. –

8

Compilar

Cuando se compila un archivo, las variables con "la duración del programa" (variables estáticas o globales) que se definen dentro de esa "unidad de compilación" (en términos aproximados, el "archivo c") determinar la cantidad de espacio global que este programa necesita y cómo se inicializa.

Enlace

Cuando el enlazador crea el ejecutable, se combina esta información y la pone en secciones del ejecutable utilizado para ese fin. Luego, el enlazador realiza y cambia todas las referencias a esos datos a dónde colocará esos datos en el espacio de memoria del proceso cuando se carga el programa. Entonces, los punteros a los datos globales serán como constantes en su archivo fuente; no se necesita reservar memoria para ellos.

Para datos globales inicializados o no inicializados, solo se almacena la cantidad de espacio necesaria para dichos datos. Para los datos inicializados, los valores iniciales se almacenan.

carga

Cuando se carga el programa, el cargador buscará en el archivo de programa para contar la cantidad de cero inicializado datos son necesidades, y deja a un lado lo suficiente de espacio de memoria del proceso para ella, y lo inicializa todos a cero binario. Para los datos inicializados, reserva memoria para eso y lo inicializa a los valores iniciales guardados en el archivo exe. También reserva áreas para el montón (utilizado por malloc()) y la pila.

dinámicos Bibliotecas

Si el código está en una biblioteca dinámica, el enlazador no puede saber dónde se va a poner los datos globales. En este caso, crea secciones en la biblioteca para indicarle dónde se encuentran las referencias a los datos globales, y el cargador se ocupa de cambiar las referencias para señalar el lugar correcto cuando carga el archivo (esta es la razón por la que pasa -fPIC en la línea de comando gcc para dlls).Pero dado que esto se hace en el momento de la carga, cuando se ejecuta el programa, la ubicación de los datos es conocida, por lo que el cargador sabe dónde estarán esos datos para que los datos globales todavía puedan actuar como constantes en su programa.

dinámico Cargando

Si se enlaza dinámicamente a una dll, el cargador no sabe nada de ella, por lo que tiene que llamar a funciones que saben cómo cargar un archivo DLL y obtener la dirección de sus datos y funciones exportadas .

4

Todo asignación hecha por malloc(), calloc() o realloc() se almacenan en el montón, mientras que todas las variables locales se almacenan en la pila.

Todas las variables globales y estáticos se almacenan en el segmento de datos, mientras que las constantes se almacenan en el segmento de código.