2012-05-22 12 views
5

Tengo un sencillo programa que inicializa una matriz como:¿Cómo se almacena la matriz en la memoria?

int a[]={10,20,30,40,50}; 

char *p; 

p=(char*)a; 

Ahora quiero acceder al valor en cada byte a través del puntero p. Para eso necesito saber cómo se almacena la matriz en la memoria (pila o montón)?

+5

Sugiero a encontrar los libros de texto de un principiante en C, ya que este tipo de pregunta es realmente lo que C se trata. –

+0

Quizás me he perdido algo, pero ¿por qué necesitas saber si está almacenado en la pila o en el montón? ¿Has probado p [0]? Tal vez usted puede hacer una pregunta diciendo lo problema que tiene por lo que tenemos un punto de partida ... – Ray

+0

Como dice @Ray, dependiendo de lo que está haciendo es muy posible que "no importa" ... y puede ser compilador Depende de varias maneras, definido por las operaciones que puede hacer en lugar de los detalles de la implementación. De cualquier manera, esas no son las únicas dos clases de almacenamiento ... bueno, al menos en C++ (apenas se dio cuenta de que esto era una pregunta C, sé poco sobre las formalizaciones de C ... alguien podría tener un vínculo más apropiado.) sin embargo, esto puede ser útil: http://www.gotw.ca/gotw/009.htm – HostileFork

Respuesta

19

Una matriz almacena sus elementos en ubicaciones de memoria contigua.
Si creó la matriz localmente estará en la pila. Donde se almacenan los elementos depende de especificación de almacenamiento.
Por ejemplo:
Una matriz declarada de forma global o estática tendría diferentes especificaciones de almacenamiento de una matriz declarada localmente. Técnicamente, el donde parte es implementación definida pero generalmente las implementaciones usarían patrones de uso similares.

  • Un array local será (por lo general) creado en pila mientras
  • A array global o estática habrá (por lo general) creado en bss/datos segmentos y
  • A matriz creada dinámicamente se creará en montón.
+3

+ 1 para las posiciones de memoria contiguas – Habib

1

Una matriz creada estáticamente estará en la pila o en las .data/.bss secciones de su binario. Una matriz creada dinámicamente (con new o malloc) se asignará en el montón.

-3

Primero, el puntero debe ser del tipo int. Una matriz es simplemente un grupo entero, guardado en la memoria como un entero, pero en una fila. un número entero tiene 4 bytes en la memoria, por lo que puede acceder a cada valor de la matriz mediante el aumento de su puntero por 4.

int *p = (int*)a; 
for(i = 0; i < 5; i++) { 
    p += 4; 
    printf("%d ", *p); 
} 
+3

Desde el PO dice s/que quiere acceder a cada byte, y se utiliza de forma explícita un char * puntero y un char * fundido, no tiene sentido decir que el puntero tiene que ser de tipo int. Además, las entradas no son necesariamente de 4 bytes y es muy incorrecto agregar 4 al puntero, ya que el sumando se multiplica por el tamaño de un int. –

6

Ya que no puedo agregar comentarios por el momento, aquí está mi granito de arena en una respuesta:

Si solo quieres saber si la memoria está en la pila o en el montón, lee las otras respuestas, están mucho más informadas que yo.

Si quieres saber exactamente donde los valores son, siempre se puede imprimir la dirección:

printf("address at a[0] = %p\n", (void *)&a[0]); 
printf("address at p[0] = %p\n", (void *)&p[0]); 

donde se dará cuenta de la misma respuesta. Pero, luego mira

printf("address at a[1] = %p\n", (void *)&a[1]); 
printf("address at p[1] = %p\n", (void *)&p[1]); 

Que es un pequeño ejercicio divertido. Sólo por diversión, ejecute el código siguiente y ver lo que se obtiene:

p[2] = 'a'; 
printf("a[0] is %d\n", a[0]); 
printf("a[1] is %d\n", a[1]); 
printf("p[2] is %d\n", p[2]); 
putchar(p[2]); 
+0

+1 por ser nuevo en SO y sugerir experimentación, que es una buena forma de explorar e investigar. Aún así, uno siempre debe recordar que los compiladores son diferentes. Entonces, solo porque observes un patrón en tus experimentos no significa que sea una "verdad". La única "verdad" está en la redacción de la especificación, lo que hace que algunos * * garantías ... pero además de los errores del compilador, la especificación todavía se apoya fuertemente en la muleta de "comportamiento indefinido". Además, el modismo es "dos centavos" (como en dinero) ... no "dos sentidos", aunque es gracioso. :) http://en.wikipedia.org/wiki/Undefined_behavior – HostileFork

+0

@HostileFork Tus puntos están bien tomados. He decidido que, como nuevo programador, dado que Google siempre parece apuntarme a SO, ¡probablemente debería unirme! Buena captura en los "centavos"! – NickO

Cuestiones relacionadas