[C con Clase] Punteros arrays y memoria.

Sorcerer sorcerer.cl en gmail.com
Jue Ene 11 23:22:56 CET 2007


Estaba probando ese código y encontré un problema, creo que también encontré
la explicación pero quisiera confirmar...

Resulta que intenté ver los tamaños de las matrices con sizeof, hice lo
siguiente:

-   printf("Peso de la matriz: %i\n", sizeof(*A)*2);
Multiplico por 2 xq supuse que como no era un array con [], entonces por eso
sizeof solo me daba el tamaño del primer elemento (en este caso, del primer
puntero).

-   printf("Peso del puntero a puntero **A: %i\n", sizeof(A));
Con ese mismo principio, este me debía dar el tamaño del primer y único
puntero a puntero.

-  printf("Peso de los int guardados en la matriz: %i\n", &A[1][3] - *A);

Y aquí esta mi problema, eso no funciona. &A[1][3] Me debería devolver la
dirección de memoria pasados el último elemento (xq solo llega hasta
A[1][2]) y *A me debería devolver la dirección de memoria del primer
elemento (del primer puntero). Si estuvieran en posiciones contiguas de
memoria, me debería dar 6, ya que tengo 6 punteros almacenados (usé el
código de Daniel y si arreglé el problema de las dimensiones de las
matrices)... sin embargo me da 9 :S

Mi teoría era que si multiplicaba el resultado de esa resta por 4, obtendría
el peso total de todos los int guardados en la matriz.

La explicación pienso que es esta: "Esto es porque creamos varios bloque de
memoria contigua pero de cantidades más pequeñas. Tomando el ejemplo
anterior, tendríamos 10.000 bloques de 39 KB. Esto es más plausibled, ya que
puede haber varios fragmentos de memoria libre para poder reservar bloques
de 39 KB."

Pero no se.... porque también observé esto otro:

Ahora, 9*4 = 36, que es el total de memoria que utiliza el array. (9 es el
valor que me daba la resta de punteros, y 4 es el peso de un int)

Usando esta formula:
"cantidad_total = N * M * 4 + N * 4 + 4
              = 4 * (N * M + N + 1)"

2*3*4 + 2*4 + 4 = 36

Entonces... ¿Es que se guardaron, punteros y enteros, en posiciones
contiguas de memoria, y al restar obtengo ese valor?. Pienso que podría ser,
ya que un puntero a char también me usa 4 bytes, o sea, no estaría mal al
multiplicar 9*4.

Si ese fuera el caso... ¿siempre es así?

Gracias por todo :]
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20070111/f8e17ce4/attachment.html>


Más información sobre la lista de distribución Cconclase