Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: digimikeh en 22 Febrero 2019, 23:12 pm



Título: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
Publicado por: digimikeh en 22 Febrero 2019, 23:12 pm
Código
  1.  
  2. int main (){
  3.  
  4.        int * numero = new int[49];
  5.        numero[151] = 750;
  6.        std::cout << numero[151] << std::endl;   //esto imprime 750 sin problemas...
  7.  
  8.  
  9.        return 0;
  10. }
  11.  

Como verán, estoy creando un puntero con una dimensión de 49 espacios de memoria del tipo int, luego estoy asignando un valor a un indice que está mas allá del rango (49) y luego lo imprimo en pantalla....  lo curioso es que me funciona, por que ?... es que acaso es lo mismo declarar:

Código
  1. int * numero = new int[49];
  2.  

que

Código
  1. int * numero = new int;
  2.  

que opinan?..
Saludos..


Título: Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
Publicado por: K-YreX en 22 Febrero 2019, 23:55 pm
Eso es erróneo aunque no aparezca ningún mensaje de error del compilador. Por ejemplo eso era un error que yo veía más en C que trabaja un poco a más bajo nivel que C++...

Un programa reserva memoria para la ejecución completa del mismo. Si no me equivoco, mientras la posición a la que intentas acceder siga dentro del marco de ese programa, no dará error (pero puede ocasionar problemas si tenías otros datos en esa posición). En cambio, cuando la posición sobrepasa los límites de memoria del programa es cuando se sucede un error en tiempo de ejecución para evitar que modifiques un espacio de memoria que puede estar usando tu ordenador para otras cosas.
Si no es exactamente así, pueden corregirme. A mí me suena que era algo así... :-X


Título: Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
Publicado por: digimikeh en 23 Febrero 2019, 00:19 am
De ser asi, en caso de que otro proceso esté ocupando ese espacio en memoria que está fuera del rango, mi programa saldría con un error de violación de acceso verdad?

Entonces lo correcto sería declarar una dimensión, es decir

Código
  1. Persona * persona = new Persona[49];
  2.  

en vez de

Código
  1. Persona * persona = new Persona;
  2.  

Si es que quiero usar un arreglo, verdad?



Título: Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
Publicado por: K-YreX en 23 Febrero 2019, 00:30 am
Exacto, mientras estés en una posición de memoria perteneciente a ese programa no, pero si accedes a memoria que no le pertenece te debería saltar un error y no se ejecutaría. Lo que se conoce como "violación de segmento" o "segmentation fault".

Y respecto al array, si lo que quieres es usar un array, tienes que declararlo como un array. Sino sólo estás reservando memoria para un objeto, no para un array de objetos. Y una vez creado mantenerte dentro de los límites para evitar errores en ejecución.  :-X


Título: Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
Publicado por: Loretz en 23 Febrero 2019, 00:55 am
Acá hay una descripción general:

Buffer overflow
https://en.wikipedia.org/wiki/Buffer_overflow (https://en.wikipedia.org/wiki/Buffer_overflow)


Título: Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
Publicado por: digimikeh en 23 Febrero 2019, 02:52 am
Excelente gracias  :D