C/Visual C - algo extraño

 
Vista:

algo extraño

Publicado por Oliver Ramirez (339 intervenciones) el 01/06/2002 19:53:24
reservo memoria dinamica para un array bidimencional de la siguiente manera:

int* array = new int [ filas*colubnas ];
siendo filas igual a 3 y colubnas tambien, el array seria de 3 filas por 3 colubnas.....
pero lo extraño es que puedo acceder toda la informacion que se encuentra fuera de estos limites sin que el sistema operativo me de violacion de acceso a memoria.

COMO PUEDE SER QUE PUEDO ACCEDER LIBREMENTE A INFORMACION Y POSICIONES DE MEMORIA QUE NO RESERVE?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:algo extraño

Publicado por Alexis Leung Cheung (70 intervenciones) el 02/06/2002 04:52:21
Por eso dicen que C\C++ es muy flexible, pero claro acceder de esa forma es PELIGROSÍSIMO porque no sabes que existe en aquella posición de memoria y puedes llevar la caída del sistema si sobreescribes algo ahí. ¿Porque crees que las cadenas de texto en C deben terminar en '\0'?, pues para saber cuando termina el array y evitar que el sistema acceda a memoria no reservada o desconocida por el programa. Es como si en un puntero hicieras esto:

int *p;

p = 1251; /* NUNCA HAGAS ESTO SI NO SABES QUE ES LO QUE HAY EN ESA POSICIÓN DE MEMORIA */
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

y porque no es asi con ......

Publicado por Oliver Ramirez (339 intervenciones) el 02/06/2002 06:26:39
y por que no sucede con los array estaticos?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:y porque no es asi con ......

Publicado por chuidiang (677 intervenciones) el 02/06/2002 07:21:20
Yo creo que con los estáticos también pasa. El C, que yo sepa, no hace ningún tipo de comprobación en los ínidices de los arrays.
Sé bueno.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:y porque no es asi con ......

Publicado por Oliver Ramirez (339 intervenciones) el 02/06/2002 18:02:45
es cierto que no comprueba, pero creo que no me han entendido...

si reservo memoria estatica para un array en memoria y una vez compilado el programa intento acceder mas aya del espacio reservado el c++ no me da ningun error si no el sistema operativo. el sistema operativo inmediatamente cierra el programa diciendo que el programa ha violado un espacio de memoria restringido... pero

MI PROBLEMA ES QUE CUANDO DEFINO ESTO MISMO PERO DINAMICAMENTE Y ACCEDO A ESPACIO DE MEMORIA QUE NO RESERVE EL SISTEMA OPERATIVO NO DA ERROR DE ACCESO A MEMORIA NI NADA, Y EL COMPILADOR COMO ES LOGICO TAMPOCO.

ENTONCES, COMO ES POSIBLE QUE SI RESERVO UN ESPACIO DETERMINADO, DESPUES PUEDO ACCEDER MAS AYA DEL MISMO SIN QUE EL SISTEMA OPERATIVO ME LANCE UNA EXEPCION NI ERROR DE ACCESO A MEMORIA?
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:y porque no es asi con ......

Publicado por Alexis Leung Cheung (70 intervenciones) el 02/06/2002 19:57:13
Reserves dinámicamente o estáticamente es lo mismo, la única diferencia es que los arrays dinámicos se reserven en un bloque de memoria llamado HEAP ó MONTON y los estáticos en el mismo bloque de memoria que los globales. Que te de un error o no, puede variar, pues tal vez en la ocasión cuando te dió el error, lo más probable es que la memoria que utilizaste estaba siendo ocupada por el SISTEMA OPERATIVO y lo sobreescribiste con otro dato. Esto pasa muy a menudo cuando utilizas los punteros, pero recuerda que es peligroso que hagas esto. No te lo recomiendo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar