Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Duda tablas dinámicas

Estas en el tema de Duda tablas dinámicas en el foro de C/C++ en Foros del Web. Hola, estoy aprendiendo sobre el uso de tablas dinámicas en c++. Estoy ejecutando el siguiente programa: #include <iostream> using namespace std; int main() { int ...
  #1 (permalink)  
Antiguo 19/08/2009, 04:05
 
Fecha de Ingreso: agosto-2009
Mensajes: 1
Antigüedad: 14 años, 8 meses
Puntos: 0
Duda tablas dinámicas

Hola, estoy aprendiendo sobre el uso de tablas dinámicas en c++.
Estoy ejecutando el siguiente programa:

#include <iostream>
using namespace std;

int main() {
int **tabla;
int n=3;
int m=3;
int i;

// Array de punteros a int:
tabla = new int*[n];
// n arrays de m ints
for(i = 0; i < n; i++)
tabla[i] = new int[m];
tabla[2][20] = 1234;
cout << tabla[2][20] << endl;
// Liberar memoria:
for(i = 0; i < n; i++) delete[] tabla[i];
delete[] tabla;

cin.get();
return 0;
}


El programa funciona bien, no da error ni en compilación ni en ejecución. Sin embargo, como puede verse en el código, la matriz que defino es de 3x3 elementos y estoy accediendo a la posición [2][20] sin ningún problema.

¿Puede alguien aclararme esta contradicción? Si excedo el valor del primer índice, es decir, si intento acceder a la posición [20][2] sí que da error por fallo de segmentación.

Todo esto viene a colación de un programa bastante más complejo en el que, tras usar tablas dinámicas, obtengo el siguiente error de ejecución:

*** glibc detected *** ./CLEAN2: free(): invalid pointer: 0x0a08ad68 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7dbc454]
/lib/tls/i686/cmov/libc.so.6(cfree+0x96)[0xb7dbe4b6]
/usr/lib/libstdc++.so.6(_ZdlPv+0x21)[0xb7f990b1]
/usr/lib/libstdc++.so.6(_ZdaPv+0x1d)[0xb7f9910d]
./CLEAN2[0x804b687]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe5)[0xb7d63685]
./CLEAN2[0x804a951]
======= Memory map: ========
08048000-08090000 r-xp 00000000 08:07 1211084 /usr/local/CLEAN/CLEAN2
08090000-08091000 rw-p 00048000 08:07 1211084 /usr/local/CLEAN/CLEAN2
0a086000-0a0a7000 rw-p 0a086000 00:00 0 [heap]
b3800000-b3821000 rw-p b3800000 00:00 0
b3821000-b3900000 ---p b3821000 00:00 0
b393a000-b7d4d000 rw-p b393a000 00:00 0
b7d4d000-b7ea5000 r-xp 00000000 08:07 794449 /lib/tls/i686/cmov/libc-2.8.90.so
b7ea5000-b7ea7000 r--p 00158000 08:07 794449 /lib/tls/i686/cmov/libc-2.8.90.so
b7ea7000-b7ea8000 rw-p 0015a000 08:07 794449 /lib/tls/i686/cmov/libc-2.8.90.so
b7ea8000-b7eab000 rw-p b7ea8000 00:00 0
b7eab000-b7eb8000 r-xp 00000000 08:07 778447 /lib/libgcc_s.so.1
b7eb8000-b7eb9000 r--p 0000c000 08:07 778447 /lib/libgcc_s.so.1
b7eb9000-b7eba000 rw-p 0000d000 08:07 778447 /lib/libgcc_s.so.1
b7eba000-b7ede000 r-xp 00000000 08:07 794458 /lib/tls/i686/cmov/libm-2.8.90.so
b7ede000-b7edf000 r--p 00023000 08:07 794458 /lib/tls/i686/cmov/libm-2.8.90.so
b7edf000-b7ee0000 rw-p 00024000 08:07 794458 /lib/tls/i686/cmov/libm-2.8.90.so
b7ee0000-b7fc3000 r-xp 00000000 08:07 1030239 /usr/lib/libstdc++.so.6.0.10
b7fc3000-b7fc7000 r--p 000e3000 08:07 1030239 /usr/lib/libstdc++.so.6.0.10
b7fc7000-b7fc8000 rw-p 000e7000 08:07 1030239 /usr/lib/libstdc++.so.6.0.10
b7fc8000-b7fce000 rw-p b7fc8000 00:00 0
b7fdf000-b7fe0000 rw-p b7fdf000 00:00 0
b7fe0000-b7fea000 r-xp 00000000 08:07 286173 /usr/local/c++/lib/libutil.so
b7fea000-b7feb000 rw-p 00009000 08:07 286173 /usr/local/c++/lib/libutil.so
b7feb000-b800d000 r-xp 00000000 08:07 286289 /usr/local/c++/lib/libwav.so
b800d000-b800e000 rw-p 00022000 08:07 286289 /usr/local/c++/lib/libwav.so
b800e000-b800f000 rw-p b800e000 00:00 0
b800f000-b8016000 r-xp 00000000 08:07 286194 /usr/local/c++/lib/libxop_fft.so
b8016000-b8017000 rw-p 00007000 08:07 286194 /usr/local/c++/lib/libxop_fft.so
b8017000-b8078000 r-xp 00000000 08:07 286187 /usr/local/c++/lib/libimatge.so
b8078000-b807a000 rw-p 00061000 08:07 286187 /usr/local/c++/lib/libimatge.so
b807a000-b807c000 rw-p b807a000 00:00 0
b807c000-b8096000 r-xp 00000000 08:07 776739 /lib/ld-2.8.90.so
b8096000-b8097000 r-xp b8096000 00:00 0 [vdso]
b8097000-b8098000 r--p 0001a000 08:07 776739 /lib/ld-2.8.90.so
b8098000-b8099000 rw-p 0001b000 08:07 776739 /lib/ld-2.8.90.so
bf882000-bf898000 rw-p bffea000 00:00 0 [stack]
Bandera 2Cancelado


Muchas gracias!!
  #2 (permalink)  
Antiguo 19/08/2009, 05:08
 
Fecha de Ingreso: agosto-2009
Mensajes: 67
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Duda tablas dinámicas

Hola...

Jejeje... buena la que has liado con los punteros... ;)

Veamos si consigo explicarte algo, que hace ya tiempo que dejé el C++ y puede que las explicaciones no sean correctas del todo.

En C / C++ los datos de un array se almacenan de forma 'aplanada', o sea, que donde acaba una fila empieza la siguiente. En realidad, una tabla no es más que un puntero (puedes probar a acceder a la posicion [0][0] sin poner corchetes) que apunta a la primera posición de tu array.

Lamentablemente, en C, a diferencia de Java, no pasa nada si tú te pasas de los límites del array (a fin de cuentas es un puntero a memoria) y tu puntero se va a tomar algo a otras zonas de memoria. Lo que haya en esas zonas ya es otra cuestión. Cuando lees el dato, la máquina te devuelve ese dato al que estás apuntando. ¿Que está 400Bytes más allá del que tú querías? ¡¡¡Ahhhh, se siente!!! También puede ser que la zona de memoria a la que intentas acceder esté protegida y entonces tendrás un error de lectura o escritura.

Además es incluso posible que corrompas los datos de otro de tus arrays que estás usando para el mismo programa.

En tu caso, acceder a la posición [2][20] no falla porque caerá dentro del segmento de memoria asignado a tu programa, pero la posición [20][2] está fuera de esa porción de memoria a la que tienes acceso, resultado: Error de segmentación.

En cuanto al error, parece que estás intentando liberar memoria de un puntero incorrecto. Depura para ver qué variable lo produce y vigila que no hayas asignado valores incorrectos, te hayas pasado de los límites de un array, asignado null al puntero correspondiente o liberado con anterioridad.


Espero que te sirva.

Un saludo y suerte.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:36.