tiene sentido un puntero para uso como arreglo con una dimensión entregada?

Iniciado por digimikeh, 22 Febrero 2019, 23:12 PM

0 Miembros y 1 Visitante están viendo este tema.

digimikeh

Código (cpp) [Seleccionar]


int main (){

       int * numero = new int[49];
       numero[151] = 750;
       std::cout << numero[151] << std::endl;   //esto imprime 750 sin problemas...


       return 0;
}


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 (cpp) [Seleccionar]

int * numero = new int[49];


que

Código (cpp) [Seleccionar]

int * numero = new int;


que opinan?..
Saludos..
Dungeons & dragons;
dragons.Attack();

K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

digimikeh

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 (cpp) [Seleccionar]

Persona * persona = new Persona[49];


en vez de

Código (cpp) [Seleccionar]

Persona * persona = new Persona;


Si es que quiero usar un arreglo, verdad?

Dungeons & dragons;
dragons.Attack();

K-YreX

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
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;


digimikeh

Dungeons & dragons;
dragons.Attack();