elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  tiene sentido un puntero para uso como arreglo con una dimensión entregada?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: tiene sentido un puntero para uso como arreglo con una dimensión entregada?  (Leído 2,566 veces)
digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
tiene sentido un puntero para uso como arreglo con una dimensión entregada?
« 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..


En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
« Respuesta #1 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


En línea

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

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
« Respuesta #2 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?

« Última modificación: 23 Febrero 2019, 00:24 am por digimikeh » En línea

Dungeons & dragons;
dragons.Attack();
K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
« Respuesta #3 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
« Última modificación: 23 Febrero 2019, 00:31 am por YreX-DwX » En línea

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

Desconectado Desconectado

Mensajes: 117


Ver Perfil
Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
« Respuesta #4 en: 23 Febrero 2019, 00:55 am »

Acá hay una descripción general:

Buffer overflow
https://en.wikipedia.org/wiki/Buffer_overflow
En línea

digimikeh

Desconectado Desconectado

Mensajes: 191


Ver Perfil
Re: tiene sentido un puntero para uso como arreglo con una dimensión entregada?
« Respuesta #5 en: 23 Febrero 2019, 02:52 am »

Excelente gracias  :D
En línea

Dungeons & dragons;
dragons.Attack();
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Arreglo y puntero en una funcion [No me corre]
Programación C/C++
barnix456 9 4,724 Último mensaje 12 Noviembre 2012, 15:29 pm
por barnix456
Duda con puntero a arreglo de caracteres
Programación C/C++
dato000 5 4,805 Último mensaje 30 Noviembre 2012, 21:13 pm
por xiruko
Puntero de arreglo
Programación C/C++
Supermanxd 3 2,317 Último mensaje 3 Enero 2016, 01:47 am
por MAFUS
Proyecto en Dev C++ (Arreglo de dimensión variable en archivo .h") « 1 2 »
Programación C/C++
MartNahuel95 19 11,389 Último mensaje 10 Junio 2016, 05:47 am
por AlbertoBSD
Pasar a función un arreglo con punteros o con el nombre del arreglo como puntero
Programación C/C++
NOB2014 3 3,414 Último mensaje 9 Junio 2016, 17:10 pm
por geeke
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines