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

[SOLUCIONADO] Respuesta inesperada en asignación de memoria

Estas en el tema de Respuesta inesperada en asignación de memoria en el foro de C/C++ en Foros del Web. El programa es solamente para asignar la mayor cantidad de memoria posible utilizando arrays. Pero mi duda es que asigna valores cercanos a 30 mil, ...
  #1 (permalink)  
Antiguo 13/03/2015, 10:14
cristiansc93
Invitado
 
Mensajes: n/a
Puntos:
Respuesta inesperada en asignación de memoria

El programa es solamente para asignar la mayor cantidad de memoria posible utilizando arrays. Pero mi duda es que asigna valores cercanos a 30 mil, mas o menos el tamaño de un entero, y las variables son long double, esperaria una cantidad muchisimo mayor de asignación. Podria alguien decirme como corre en su computadora y/o compartirme algun conocimiento mas detallado sobre su ejecucion?

Les paso el copy-paste:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7.     long long int n = 0;
  8.     long long int * p;
  9.  
  10.     while(p != 0)
  11.  
  12. // Utilizo zero por que no me gusta modificar el compilador para que                    //agarren los null y nullptr
  13.  
  14.     {
  15.  
  16. //nothrow evita que new se rompa al toparse con la memoria maxia y no poder asignar //mas, en lugar de eso, regresa un puntero nulo o... a mi humilde entendimiento 0.
  17.  
  18.         p= new (nothrow) long long int[n];
  19.         n++;
  20.     }
  21.  
  22.     cout << endl << "-----------------------" << endl;
  23.     cout << "size: " << n << endl;
  24.  
  25.     delete[] p;
  26.  
  27.     return 0;
  28. }

Última edición por razpeitia; 13/03/2015 a las 11:28
  #2 (permalink)  
Antiguo 13/03/2015, 14:47
Avatar de Profesor_Falken  
Fecha de Ingreso: agosto-2014
Ubicación: Mountain View
Mensajes: 1.323
Antigüedad: 9 años, 8 meses
Puntos: 182
Respuesta: Respuesta inesperada en asignación de memoria

Buenas,

Te propongo una pequeña modificación en tu código que te ayudará a entender que es lo que estás haciendo/entendiendo mal:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <new>
  3. using namespace std;
  4.  
  5. int main ()
  6. {
  7.     long long int n = 0;
  8.     long long int * p;
  9.  
  10.     while(p != 0)
  11.  
  12. // Utilizo zero por que no me gusta modificar el compilador para que                    //agarren los null y nullptr
  13.  
  14.     {
  15.  
  16. //nothrow evita que new se rompa al toparse con la memoria maxia y no poder asignar //mas, en lugar de eso, regresa un puntero nulo o... a mi humilde entendimiento 0.
  17.  
  18.         p= new (nothrow) long long int[n];
  19.         n++;
  20.     }
  21.  
  22.     cout << endl << "-----------------------" << endl;
  23.  
  24. //Hemos reservado memoria para n arrays long long int, cada uno con n+1 elementos
  25.     long totalSize = 0;
  26.     for (int i = 1; i<n; i++) {
  27.         totalSize += n;
  28.     }
  29.  
  30.     cout << "Real number of allocated long long int: " << totalSize << endl;
  31.  
  32.  
  33.     delete[] p;
  34.  
  35.     return 0;
  36. }


En mi modestísimo equipo me devuelve 533794816, que son unos dos gigas. Nada mal.


Un saludo
__________________
If to err is human, then programmers are the most human of us

Última edición por Profesor_Falken; 13/03/2015 a las 14:53
  #3 (permalink)  
Antiguo 13/03/2015, 15:02
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 6 meses
Puntos: 204
Respuesta: Respuesta inesperada en asignación de memoria

Cita:
Iniciado por cristiansc93 Ver Mensaje
Código C++:
Ver original
  1. // Utilizo zero por que no me gusta modificar el compilador para que
  2. //agarren los null y nullptr
modificar el compilador?? nullptr es una palabra reservada de c++... lo que pasa es que solo está disponible a partir del estándar del 2011 (el anterior data de 1999).

null, en cambio, suele ser una convención. No es más que un alias de 0.

Personalmente creo más beneficioso usar nullptr, null y 0 (en ese estricto orden) para inicializar punteros. ¿Mis motivos? explicados en el siguiente ejemplo: Imagina que te encuentras las 3 asignaciones siguientes entre medias del código... que conclusión puedes sacar de cada una, sin conocer el resto del codigo?

Código C++:
Ver original
  1. var = 0; // Puede ser un puntero... o un número!!!
  2. var = NULL; // Entiendo que debería ser un puntero, pero también se puede usar en variables numéricas
  3. var = nullptr; // Esta asignación únicamente funciona con punteros

Queda claro, por tanto, que si ves un nullptr es que esa variable se trata de un puntero.

Otra ventaja de nullptr la encuentras en el caso de funciones sobrecargadas:

Código C++:
Ver original
  1. void func( int )
  2. {
  3.   std::cout << "func(int)" << std::endl;
  4. }
  5.  
  6. void func( char* )
  7. {
  8.   std::cout << "func(char*)" << std::endl;
  9. }
  10.  
  11. int main( )
  12. {
  13.   func( 0 ); // func(int)
  14.   func( NULL ); // func( int )
  15.   func( nullptr ); // func(char*)
  16. }

Si con esto no te he convencido, no se me ocurre que más puedo hacer :)


Código C++:
Ver original
  1. long long int n = 0;
  2. // ...
  3. p= new (nothrow) long long int[n];

Ojo con esto!!! La primera reserva que intentas hacer no es válida. No puedes crear un array de 0 elementos. El mínimo es 1.

Y, para rematar. Dices que el programa finaliza con 30.000. Veamos:

* Utilizas long long int, es decir, supongamos 64 bits
* 30.000 * 64 = 1.920.000 bits = 1.875 kb = 1.83 Mb

Es poca memoria... si, pero fíjate que dentro del bucle no liberas memoria... lo haces al salir del bucle. Pero claro, sales del bucle cuando ha fallado la reserva de memoria, luego p vale 0, luego ese delete no hace absolutamente nada.

Por otro lado, dado que no liberas memoria, el programa va creciendo y creciendo.

Un cálculo rápido nos dice que ( 30.000 * 64 ) * 15.000 = 28.800.000.000 bits consumidos = 28.125.000 kb = 27.465 Mb = 26.82 Gb.

Este cálculo es aproximado y te dice (si no me he confundido con las cuentas) la memoria consumida en 30.000 ciclos.

Como puedes ver, no es moco de pavo.

Un saludo.
  #4 (permalink)  
Antiguo 13/03/2015, 17:30
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Respuesta inesperada en asignación de memoria

Pues yo vi un inconveniente muy gordo, usa fuerza bruta y empieza desde 1 y el tamaño maximo de un long long int es inmenso y podria ser eterno dependiendo de la memoria disponible. Para hacer unas pruebas y aligerar lo maximo el proceso hice esto:
Código PHP:
#include <iostream>
#include <new>
#include <math>
using namespace std;
     
int main ()
{
   
unsigned long long int n std::numeric_limits<long long int>::max();
   
long long int *p;
   
unsigned long long int tamEnBytes;
   
double tamEnKbtamEnMbtamEnGb;
   
int nCeros=0;

   
// Voy incrementando exponencialmente 10^nDigitos para avanzar mas rapido
   // hasta un valor que de null al reservar
   
do{
      
p= new (std::nothrowlong long int[n];
      if(
== NULL){
         
nCeros++;
         
std::numeric_limits<long long int>::max() / (10*nCeros);
      }
   }while(
&& == NULL);

   
//Una vez salga libero la memoria
   
if(!= NULL)
   {
      
delete[] p;

      
// Una vez salga del bucle anterior tendré un valor mayor al que puedo usar
      // asi que lo voy decrementando hasta encontrar el valor valido maximo
      
do{
         
n++;
         
p= new (std::nothrowlong long int[n];
         if(
!= NULL)
            
delete [] p;
      }while(
!= NULL && std::numeric_limits<long long int>::max());

      
n--;
      
tamEnBytes sizeof(long long int) * n;
      
tamEnKb tamEnBytes / (double)1024 n;
      
tamEnMb tamEnKb 1024;
      
tamEnGb tamEnMb 1024;
      
cout << endl << "-----------------------" << endl;
      
cout << "Numero maximo de elementos para los que se pudo obtener memoria es: " << << endl;
      
cout << "Memoria total consumida por el array: " << endl <<
      
tamEnBytes << " bytes o " << endl <<
      
tamEnKb << " kb o " << endl <<
      
tamEnMb << " Mb o " << endl <<
      
tamEnGb << " Gb" << endl << endl;
   }
   
cout << "Presiona una tecla para salir" << endl;
   
cin.get();
   return 
0;

y me da este resultado:
Cita:
-----------------------
Numero maximo de elementos para los que se pudo obtener memoria es: 922337203716897579
Memoria total consumida por el array:
7378697629735180632 bytes o
6.64614e+33 kb o
6.49037e+30 Mb o
6.33825e+27 Gb

Presiona una tecla para salir
Muchos Gigas ¿no? ¿que hago mal para que me de esas burradas? solo tengo 1 giga de ram ¿de donde se saca tanto? Eso no lo tengo ni con el disco duro jajaja.
A ver si veis el fallo aunque pienso que pude ser algo relacionado con desbordamientos de variables o cosas asi pero no lo se seguro ni como solucionarlo.
  #5 (permalink)  
Antiguo 13/03/2015, 18:00
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

En teoría, en una plataforma de 32 bits los punteros pueden direccionar hasta 2^32 bits (4 GB), y en una de 64 bits 2^64 (algo más de 18 millones de terabytes).

En la vida real esos límites están más acotados aún debido a la cantidad de memoria real y virtual disponible, y de la porción de memoria de ese mismo address space que se reserva el sistema y sobre todo por el compilador.

Puede ser útil curiosear en:
"Memory Limits for Applications on Windows"
https://software.intel.com/en-us/art...ations-windows
  #6 (permalink)  
Antiguo 13/03/2015, 18:18
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Respuesta inesperada en asignación de memoria

Vale, vi algun fallo en los calculos pero aun asi lo veo una burrada. Asi quedó ahora:
Código PHP:
#include <iostream>
#include <new>
#include <math>
using namespace std;

int main ()
{
   
unsigned long long int n std::numeric_limits<long long int>::max();
   
long long int *p;
   
double tamEnBytestamEnKbtamEnMbtamEnGb;
   
int nCeros=0;

   
// Voy incrementando exponencialmente 10^nDigitos para avanzar mas rapido
   // hasta un valor que de null al reservar
   
do{
      
p= new (std::nothrowlong long int[n];
      if(
== NULL){
         
nCeros++;
         
std::numeric_limits<long long int>::max() / (10 nCeros);
      }
   }while(
&& == NULL);

   
//Una vez salga libero la memoria
   
if(!= NULL)
   {
      
delete [] p;

      
// Una vez salga del bucle anterior tendré un valor mayor al que puedo usar
      // asi que lo voy decrementando hasta encontrar el valor valido maximo
      
do{
         
n++;
         
p= new (std::nothrowlong long int[n];
         if(
!= NULL)
            
delete [] p;
      }while(
!= NULL && std::numeric_limits<long long int>::max());

      
n--;
      
tamEnBytes sizeof(long long int) * n;
      
tamEnKb tamEnBytes * ((double)1024);
      
tamEnMb tamEnKb 1024;
      
tamEnGb tamEnMb 1024;
      
cout << endl << "-----------------------" << endl;
      
cout << "Numero maximo de elementos para los que se pudo obtener memoria es: " << << endl;
      
cout << "Memoria total consumida por el array: " << endl <<
      
tamEnBytes << " bytes (" << (unsigned long long int)tamEnBytes << " bytes) o " << endl <<
      
tamEnKb << " Kb (" << (unsigned long long int)tamEnKb << " Kb) o " << endl <<
      
tamEnMb << " Mb (" << (unsigned long long int)tamEnMb << " Mb) o " << endl <<
      
tamEnGb << " Gb (" << (unsigned long long int)tamEnGb << " Gb) o " << endl << endl;
   }
   
cout << "Presiona una tecla para salir" << endl;
   
cin.get();
   return 
0;

Cita:
-----------------------
Numero maximo de elementos para los que se pudo obtener memoria es: 922337203716897579
Memoria total consumida por el array:
7.3787e+18 bytes o
5.76461e+16 kb o
5.6295e+13 Mb o
5.49756e+10 Gb

Presiona una tecla para salir
Me sigue pareciendo una burrada. A ver si alguien lo aclara...

Última edición por aguml; 13/03/2015 a las 18:43
  #7 (permalink)  
Antiguo 14/03/2015, 00:07
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

Pongo mi explicación en el código:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <new>
  3. #include <limits>
  4. #include <cstdint>
  5.  
  6. int main()
  7. {
  8.     long long n = std::numeric_limits<long long>::max();
  9.     long long *p;
  10.     int nCeros=0;
  11.  
  12.     do{
  13.         p= new (std::nothrow) long long[n];
  14.         if (p == nullptr){
  15.             nCeros++;
  16.             n = std::numeric_limits<long long>::max() / (10 * nCeros);
  17.         }
  18.     } while (p == nullptr);
  19.  
  20.     long long bytes = n * sizeof(long long);
  21.     std::cout << "\nDa la impresion de que se hubiera podido obtener memoria para "
  22.         << bytes << " Bytes;\n";
  23.     std::cout << "(Que serian " << bytes/1024.0/1024/1024 << " GB)\n\n";
  24.  
  25.     std::cout << "Incluso se puede tener la ilusion de que es posible\n"
  26.         "operar sobre ese espacio de memoria ...\n\n";
  27.  
  28.     std::cout << "Por ejemplo:\n";
  29.     p[0] = 5;
  30.     p[n-1] = 6;
  31.  
  32.     std::cout << "p[0] = " << p[0] << '\n';
  33.     std::cout << "p[" << n-1 << "] = " << p[n-1] << '\n';
  34.  
  35.     std::cout << "\nPero, realmente? Existe algo que se llame p[" << n-1 << "]?\n\n";
  36.  
  37.     std::cout << "size_t desilucion;\n";
  38.     size_t desilusion;
  39.  
  40.     std::cout << "El operator new usa el tipo size_t para el tamaño de los objetos.\n\n";
  41.  
  42.     std::cout << "En este caso, haciendo desilusion = n-1:\n";
  43.     desilusion = n-1;  // el compilador debería advertir que se trunca
  44.     std::cout << "la asignacion parece decir: desilusion = " << n-1 << ";\n\n"
  45.         "pero en realidad, al truncarse, lo que realmente queda es:\n";
  46.     std::cout << "desilusion == " << desilusion << "\n\n";
  47.  
  48.     std::cout << "De modo que:\n";
  49.     std::cout << "p[0] == " << p[0] << '\n';
  50.     std::cout << "p[" << desilusion << "] == " << p[desilusion] << "\n\n";
  51.  
  52.  
  53.     std::cout << "Como puede verse, el tamaño efectivamente asignado fue de:\n";
  54.     std::cout << desilusion * sizeof(long long) << " Bytes;\n";
  55.     std::cout << "que son " << desilusion * sizeof(long long)/ 1024.0/1024/1024
  56.         << " GB,\nque ya no es tan burrada, o es una burrada dentro de los limites esperados.\n\n";
  57.  
  58.  
  59.     std::cout << "P.D.: Aunque los arrays no son punteros... (es broma :),\n"
  60.         "siempre que se trate de direcciones de memoria, la medida\n"
  61.         "deberia expresarse en size_t\n";
  62.  
  63. }

Última edición por lareto; 14/03/2015 a las 00:41
  #8 (permalink)  
Antiguo 14/03/2015, 05:00
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Respuesta inesperada en asignación de memoria

Gracias amigo por tu tiempo pero tengo dudas y muchas aun jajaja.
A ver:
Código PHP:
std::cout << "la asignacion parece decir: desilusion = " << n-<< ";\n\n"
    "pero en realidad, al truncarse, lo que realmente queda es:\n"
;
std::cout << "desilusion == " << desilusion << "\n\n"
Ciertamente en mi caso el truncado es brutal ya que n-1 es 922337203685477579 y desilusion vale 3435973835. ¿donde están los 922337203685477579 miembros?
Con eso no se que decir ya que si p[desilusion] y p[n-1] apuntan al mismo sitio ¿que pasa si realmente quiero ver el valor de p[n-1] donde n sea 3435973836? pues que desilusion no se truncaria no? no se, tengo un cacao...
El caso es que al ser desilusion de 4 bytes y n de 8 bytes ¿cuantas veces se ha truncado desilusion? ¿como sabe a cual de esas veces me refiero para mostrar el valor correcto?

PD: al hacer p[n-1]... el compilador me da warnings de Suspicious pointer aritmetich.

Última edición por aguml; 14/03/2015 a las 05:50
  #9 (permalink)  
Antiguo 14/03/2015, 06:09
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

Cita:
Ciertamente en mi caso el truncado es brutal ya que n-1 es 922337203685477579 y desilusion vale 3435973835. ¿donde están los 922337203685477579 miembros?
No están en ningún lado, nunca existieron. El programa está intentando asignar una cantidad de memoria imposible e ir bajando las pretensiones hasta que lo consiga, y para eso usa la expresión:
Código C++:
Ver original
  1. p= new (std::nothrow) long long[n];
Pero, como en tu plataforma un long long es de 64 bits, mientras que un size_t es de 32, lo que realmente está sucediendo es:
Código C++:
Ver original
  1. p= new (std::nothrow) long long[(size_t)n];
Y esa asignación tiene éxito cuando es posible asignar n * sizeof(long long) truncados al hacer el cast a size_t.
Recuerda que la cantidad de memoria que puede asignar tu programa depende varios factores (¿leíste el artículo que mencionaba en mi primer mensaje, verdad?), y que para un Windows de 32 bits es razonable esperar algo así como 1,7 GB (que van a salir de la ram; y si no alcanza, del archivo de intercambio).
Cita:
... ¿que pasa si realmente quiero ver el valor de p[n-1] donde n sea 3435973836?
Si has asignado una cantidad de bytes a p, ese es el límite de tu variable, más allá hay cualquier cosa, otros datos o código del programa, lo que sea que haya en la memoria después de p. Pero si el programa ya agotó todo su espacio permitido por el sistema operativo, 3435973836 queda fuera de su universo, que en CPUs en modo protegido (https://en.wikipedia.org/wiki/Protected_mode) significa la muerte del programa.

Cita:
El caso es que al ser desilusion de 4 bytes y n de 8 bytes ¿cuantas veces se ha truncado desilusion?
Puedes hacer la cuenta; tienes a
std::numeric_limits<size_t>::max() y a
std::numeric_limits<long long>::max() y que
std::numeric_limits<size_t>::max() +1 == 0

Cita:
PD: al hacer p[n-1]... el compilador me da warnings de Suspicious pointer conversion.
Parece razonable. En términos de aritmética de punteros, p[n-1] es p + n-1, donde n se definió como long long, pero se usa truncado a size_t.

Última edición por lareto; 14/03/2015 a las 06:15
  #10 (permalink)  
Antiguo 14/03/2015, 07:00
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Respuesta inesperada en asignación de memoria

Ya lo voy pillando, entonces me surge otra pregunta ¿que pasa si intento llenar todos sus miembros con el valor maximo - 1 de un long long? o lo que es lo mismo, obligo al programa a guardar un valor muy grande de tipo long long en todos sus miembros. ¿Crashearia y se cerraria el programa? ya que la memoria realmente no existe porque ha asignado para size_t y no para long long ¿no?
El codigo anterior lo he puesto para que tarde el menor tiempo posible en dar con el valor maximo de forma precisa aunque supongo que este seria un caso para hacerlo de forma recursiva pero yo y la recursividad nos odiamos
Aqui el codigo:
Código PHP:
#include <iostream>
#include <new>
#include <math>
using namespace std;

int main ()
{
   
unsigned long long int n std::numeric_limits<long long int>::max();
   
long long int *ptamEnBytestamEnKb;
   
double tamEnMbtamEnGb;
   
int nCeros=0;
   
size_t maxSize;
   
   
// Voy dividiendo el valor maximo del tipo long long int entre 10*nDigitos para avanzar mas rapido
   // incrementando nDigitos en cada pasada hasta dar con un valor que no de null al reservar
   
do{
      
p= new (std::nothrowlong long int[n];
      if(
== NULL){
         
nCeros++;
         
std::numeric_limits<long long int>::max() / (10 nCeros);
      }
   }while(
&& == NULL);

   
//Una vez salga libero la memoria
   
if(!= NULL)
   {
      
delete [] p;

      if(
!= std::numeric_limits<long long int>::max())
      {
         
// Una vez salga del bucle anterior tendré un valor mayor al que puedo usar
         // asi que lo voy decrementando hasta encontrar el valor valido maximo
         
do{
            
n+=10000;
            
p= new (std::nothrowlong long int[n];
            if(
!= NULL)
               
delete [] p;
         }while(
!= NULL && std::numeric_limits<long long int>::max());

         do{
            
-= 1000;
            
p= new (std::nothrowlong long int[n];
         }while(
&& == NULL);

         
delete [] p;

         
// Una vez salga del bucle anterior tendré un valor mayor al que puedo usar
         // asi que lo voy decrementando hasta encontrar el valor valido maximo
         
do{
            
n+=100;
            
p= new (std::nothrowlong long int[n];
            if(
!= NULL)
               
delete [] p;
         }while(
!= NULL && std::numeric_limits<long long int>::max());

         do{
            
-= 10;
            
p= new (std::nothrowlong long int[n];
         }while(
&& == NULL);

         
delete [] p;

         
// Una vez salga del bucle anterior tendré un valor mayor al que puedo usar
         // asi que lo voy decrementando hasta encontrar el valor valido maximo
         
do{
            
n++;
            
p= new (std::nothrowlong long int[n];
            if(
!= NULL)
               
delete [] p;
         }while(
!= NULL && std::numeric_limits<long long int>::max());

         
n--;
      }
      
      
maxSize n-1;
      
tamEnBytes sizeof(long long int) * maxSize;
      
tamEnKb tamEnBytes 1024;
      
tamEnMb tamEnKb 1024.0;
      
tamEnGb tamEnMb 1024;
      
cout << endl << "-----------------------" << endl;
      
cout << "Numero maximo de elementos para los que se pudo obtener memoria es: " << << endl;
      
cout << "Memoria total consumida por el array: " << endl <<
      
tamEnBytes << " bytes o " << endl <<
      
tamEnKb << " Kb o " << endl <<
      
tamEnMb << " Mb o " << endl <<
      
tamEnGb << " Gb" << endl << endl;
   }
   
cout << "Presiona una tecla para salir" << endl;
   
cin.get();
   return 
0;

  #11 (permalink)  
Antiguo 14/03/2015, 21:17
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

Cita:
Iniciado por aguml Ver Mensaje
... ¿que pasa si intento llenar todos sus miembros con el valor maximo - 1
No pasa nada. El tamaño de un tipo no cambia con el valor que vaya a tener un objeto de ese tipo.
  #12 (permalink)  
Antiguo 15/03/2015, 02:55
 
Fecha de Ingreso: febrero-2015
Mensajes: 404
Antigüedad: 9 años, 2 meses
Puntos: 3
Respuesta: Respuesta inesperada en asignación de memoria

Cita:
Iniciado por lareto Ver Mensaje
No pasa nada. El tamaño de un tipo no cambia con el valor que vaya a tener un objeto de ese tipo.
Pero si decimos que es imposible que reserve tanta memoria y que es truncada ¿donde piensa escribir cuando intente escribir en todos y cada uno de los miembros?
  #13 (permalink)  
Antiguo 15/03/2015, 13:38
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

Me tomó cierto esfuerzo hacer el programa con intención de aclararlo, pero se ve que no funcionó. Paso.
  #14 (permalink)  
Antiguo 23/03/2015, 11:18
cristiansc93
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Respuesta inesperada en asignación de memoria

Agradezco sus respuestas, estudiaré el código mas de cerca. Muy buenas explicaciones a todos

Etiquetas: int, memoria, programa, respuesta
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 06:08.