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

[SOLUCIONADO] Peta o no peta XD

Estas en el tema de Peta o no peta XD en el foro de C/C++ en Foros del Web. Hola amigos! Me tope con algo que para mi al menos es de lo más curioso. Resulta que no lo entiendo por qué en la ...
  #1 (permalink)  
Antiguo 20/03/2016, 08:24
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Peta o no peta XD

Hola amigos!

Me tope con algo que para mi al menos es de lo más curioso. Resulta que no lo entiendo por qué en la pila, si declaramos un array muy largo si peta el programa, pero luego globalmente no. ¿Alguien sabe explicarme eso?

Sé que en una función la pila está limitada, a yo que sé... 2 megas creo, y que las globales van a otra parte de la memoria ¿Pero para globales es que no hay limitaciones? ¿O es mayor el tamanho del almacenamiento? No lo entiendo, me tiene echo un lio. Si alguien me lo puede esclarecer lo agradezco de antemano

Código C++:
Ver original
  1. #include<stdio.h>
  2. #define N 500000000
  3.  
  4. //int vetor[N]; //Aqui no peta
  5.  
  6. int main() {
  7.     int vetor[N]; //Aqui peta =/
  8.  
  9.     return 0;
  10. }


Un saludo a todos del foro.
  #2 (permalink)  
Antiguo 20/03/2016, 10:08
Avatar de xKuZz  
Fecha de Ingreso: febrero-2015
Ubicación: nullptr
Mensajes: 183
Antigüedad: 9 años, 2 meses
Puntos: 27
Respuesta: Peta o no peta XD

Hay 3 maneras de almacenar un dato:
  • Estática/Global
    Al declarase en un ámbito global ya se fuera del main o con la palabra reservada static el espacio es reservado en el momento de compilación. Si el tamaño es más grande de lo permitido el compilador dará un error del tipo array size is too large
  • Pila (Stack) /Automático
    Al ponerlo como lo tenías dentro del main la reserva se hace en tiempo de ejecución añadiendo al tamaño de la pila, no obstante en este caso el programa será finalizado por el SO si superas el límite que el mismo pone para la pila de tu programa.
  • Dinámica [new/delete, malloc/free]
    En este caso puedes utilizar lo que tienes es un puntero a una dirección de memoria fuera de la zona de memoria reservada para la pila y de la zona de variables estáticas a partir de la que empieza un bloque de memoria de X tamaño que tienes reservado. No olvides liberarlo.

En conclusión, si necesitas trabajar con grandes tamaños de memoria la mejor opción que tienes es usar memoria dinámica.
  #3 (permalink)  
Antiguo 20/03/2016, 10:14
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Peta o no peta XD

Cada cosa se almacena en un sitio diferente. La pila se utiliza para variables locales, ya que únicamente admite dos operaciones: push para añadir un elemento y pop para sacarlo. No admite, por tanto, accesos aleatorios ni sacar un elemento que no sea el último.

Un espacio de almacenamiento de estas características es poco apto para almacenar variables globales, pues éstas deben estar accesibles en todo momento.

Las variables globales se guardan en otra región de memoria que es de lectura/escritura.

El motivo por el que al declarar el array como global el programa no peta es porque la memoria que te comento es más grande que la utilizada en la pila.

Un saludo
__________________
La ayuda se paga con esfuerzo o con dinero. Si no estás dispuesto a esforzarte y quieres que te hagan los deberes pide presupuesto, al menos así ahorrarás tiempo.
  #4 (permalink)  
Antiguo 20/03/2016, 11:55
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 6 meses
Puntos: 38
Respuesta: Peta o no peta XD

¡Gracias por la explicación! Saludos.

Etiquetas: int, programa
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 07:34.