[C con Clase] Problema conceptual al pasar por referencia array de 2 dimensiones en C

Felipe Valencia anfevp en gmail.com
Mie Jun 10 22:03:05 CEST 2015


Hola,

Esencialmente existe una diferencia entre como se organizan los dople
punteros y las matrices de dos dimensiones. Las marices de dos dimensiones
se organizan consecutivamente y los dobles punteros estan esparcidos en
memoria.

Mira este enlace
http://stackoverflow.com/questions/4470950/why-cant-we-use-double-pointer-to-represent-two-dimensional-arrays
(Ingles)

De hecho en la posicion test[1] esta el valor de la siguiente linea, seria
un 6 si continuaras con la inicializacion, y en la posicion referencia[1]
sera leida como la direccion de la siguiente linea.

Ademads en PC de  64 bits los punteros son de 64 bits y los float son de 32
bits. Agrega la linea printf("Size %d %d \n",sizeof(float*),sizeof(float));

Yo usualmente en estos casos uso matrices de una dimension en vez de dos
dimensiones, y calculo los indices, o solo uso punteros reservando memoria
con malloc o new.

Ademas uso como IDE eclipse el cual trae un debuggeador donde puedes vez
los valores en memoria, supongo que Code::Blocks tambien debe mostrar
memoria


Chao!!




El 10 de junio de 2015, 20:17, Diego <diegogeid en gmail.com> escribió:

> Hola, saludos a todos.
>
> Aparentemente estoy teniendo un error conceptual. Copio el código
> abajo. Alguien podría ayudarme?
>
> Al intentar acceder a un elemento del aray desde el main no tengo
> problemas, pero al intentar acceder desde una función el programa
> retorna al sistema operativo un código de error (0xC0000005) y
> porsupuesto que no continúa.
>
> Según los printf, los punteros apuntan a la misma posicion de memoria
> tanto en el main como en la función, que estoy haciendo mal?
>
> PD: estoy compilando en Windows mediante Code::Blocks en Windows
> mediante gcc, el error que da, según google, corresponde a una
> violación de acceso a memoria.
>
> Saludos y gracias!
>
> ----------------------------------------------
>
> #include <stdio.h>
> #include <stdlib.h> //No es necesario
>
> void probar(float **referencia)
> {
>
>     printf("La posición de memoria donde empieza el array
> multidimensional es %p\n", referencia);
>
> //No imprime el siguiente printf y vuelve al ssitema con un error
> 0xC0000005
>
>     printf("test: %f %f...!\nPuntero: %p\n", referencia[0][0],
> referencia[0][1], referencia);
> }
>
> int main()
> {
>     float test[5][5]={1, 2, 3, 4, 5};
>
>     printf("La posición de memoria donde empieza el array
> multidimensional es %p\n", test);
>
>     printf("test: %f %f...!\nPuntero: %p\n", test[0][0], test[0][1], test);
>
>     probar(test);
>
>     return 0;
> }
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>



-- 
Andrés Felipe Valencia P
MSc student
ALaRI - Advanced Learning and Research Institute USI - Università della
Svizzera Italiana
 Via Giuseppe Buffi 13, Lugano CH-6904, Switzerland
 Mobile: + 41 076 822 27 57
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20150610/533ffffc/attachment.html>


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