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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Dimensión de Arreglos en C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 2 [3] Ir Abajo Respuesta Imprimir
Autor Tema: Dimensión de Arreglos en C  (Leído 13,657 veces)
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Dimensión de Arreglos en C
« Respuesta #20 en: 26 Septiembre 2011, 05:34 am »

La verdad no se cual es el tamaño pero puedes hacer esto como te dijo LearningSpanishProgrammer hacer un while hasta que malloc() te devuelva NULL:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5. char * arreglo;
  6. unsigned long long i = 1;
  7. do{
  8. arreglo = (char*)malloc(i);
  9. free(arreglo);
  10. i++;
  11. }while(arreglo != NULL);
  12.  
  13. printf("breakpoint\n");  // Hacer breakpoint aqui
  14.  
  15. return 0;
  16. }
  17.  

Yo probé esto y la verdad nunca salio del ciclo así que el tamaño debe ser MUY grande.


En línea

Lambda


Desconectado Desconectado

Mensajes: 371



Ver Perfil WWW
Re: Dimensión de Arreglos en C
« Respuesta #21 en: 26 Septiembre 2011, 10:31 am »

La verdad no se cual es el tamaño pero puedes hacer esto como te dijo LearningSpanishProgrammer hacer un while hasta que malloc() te devuelva NULL:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(){
  5. char * arreglo;
  6. unsigned long long i = 1;
  7. do{
  8. arreglo = (char*)malloc(i);
  9. free(arreglo);
  10. i++;
  11. }while(arreglo != NULL);
  12.  
  13. printf("breakpoint\n");  // Hacer breakpoint aqui
  14.  
  15. return 0;
  16. }
  17.  

Yo probé esto y la verdad nunca salio del ciclo así que el tamaño debe ser MUY grande.

Nunca sale del ciclo por que siempre liberas la memoria.

Calcular el tamaño maximo de un array es medio estupido, nunca va a ser el mismo por una razon principal, el sistema rara vez va a tener la misma cantidad exacta de bytes libres, en todo caso en windows x86 (ni idea de linux) cuando llegues al limite de 2GB (>2GB si usas LAA) por proceso te empezara a retornar NULL malloc.

En resumen, el tamaño maximo de un array/arreglo en C/C++ y diria que la gran mayoria de lenguajes de programacion esta limitado por la cantidad de memoria que tienes libre en el PC.


En línea

LearningSpanishProgrammer

Desconectado Desconectado

Mensajes: 67


Ver Perfil
Re: Dimensión de Arreglos en C
« Respuesta #22 en: 27 Septiembre 2011, 03:25 am »

*ignore I made a mistake*
« Última modificación: 27 Septiembre 2011, 03:36 am por LearningSpanishProgrammer » En línea

Estoy aprendiendo español, y tu estas aprendiendo programación
rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Dimensión de Arreglos en C
« Respuesta #23 en: 27 Septiembre 2011, 03:52 am »

Nunca sale del ciclo por que siempre liberas la memoria.
No. La variable "arreglo" contiene la ultima direccion retornada por malloc, la liberacion de memoria en la siguiente sentencia no afecta la condicion del bucle.

Si piensan ejecutar un bucle asi seria mejor cambiar el incremento a 1 KB o 1 MB.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Lambda


Desconectado Desconectado

Mensajes: 371



Ver Perfil WWW
Re: Dimensión de Arreglos en C
« Respuesta #24 en: 27 Septiembre 2011, 14:46 pm »

No. La variable "arreglo" contiene la ultima direccion retornada por malloc, la liberacion de memoria en la siguiente sentencia no afecta la condicion del bucle.

Si piensan ejecutar un bucle asi seria mejor cambiar el incremento a 1 KB o 1 MB.

Un saludo

Si que afecta, fijate mejor xD

El bucle acabara cuando el sistema se quede sin memoria y retorne NULL, eso nunca pasara por que hace free a la memoria que reserva.
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Dimensión de Arreglos en C
« Respuesta #25 en: 27 Septiembre 2011, 17:52 pm »

Si que afecta, fijate mejor xD

El bucle acabara cuando el sistema se quede sin memoria y retorne NULL, eso nunca pasara por que hace free a la memoria que reserva.
No. Las llamadas anteriores no importan porque la intención no es realizar un proceso acumulativo.

Si se llama a "malloc" y esta falla su valor (NULL) se almacenara en la variable "arreglo" y eso causara la salida del bucle.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Lambda


Desconectado Desconectado

Mensajes: 371



Ver Perfil WWW
Re: Dimensión de Arreglos en C
« Respuesta #26 en: 27 Septiembre 2011, 18:41 pm »

No. Las llamadas anteriores no importan porque la intención no es realizar un proceso acumulativo.

Si se llama a "malloc" y esta falla su valor (NULL) se almacenara en la variable "arreglo" y eso causara la salida del bucle.

Un saludo

La intencion ES hacer un proceso acumulativo, ese es el objetivo del programa, calcular cual es el tamaño maximo de un array antes de que el sistema se quede sin memoria, el tema es que la intencion se ve inutilizada por el hecho de que desues del malloc hace un free, lo cual hace que nunca salga del bucle, descomenta el free y veras como esa accion si afecta al bucle, no instantaneamente, pero si cuando el sistema se quede sin memoria y en la siguiente iteracion malloc retorne NULL
En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Dimensión de Arreglos en C
« Respuesta #27 en: 27 Septiembre 2011, 22:52 pm »

Por lo visto tenemos una confusión, a ver si ahora me explico mejor.

Cuando indique que el proceso no es acumulativo me refería a la llamada a "malloc", no al incremento del contador "i".

Cuando se reserva memoria la variable "arreglo" sirve como bandera para saber si la reserva fue exitosa o no. Después de ello se libera pero eso no importa porque basta con revisar el valor de esa variable para conocer si funciono (diferente de NULL) o no (NULL).

Si por curiosidad se desea conocer si es posible realizar la máxima (en teoría) reserva de memoria basta con:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   size_t max = -1;
  7.   char *p;
  8.  
  9.   p = malloc(max);
  10.   free(p);
  11.  
  12.   if (p)
  13.      puts("OK");
  14.   else
  15.      puts("Error");
  16.  
  17.   return EXIT_SUCCESS;
  18. }
El programa anterior de naderST realiza (poco mas o poco menos) lo mismo: acercarse al punto donde la reserva de memoria falle.

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Lambda


Desconectado Desconectado

Mensajes: 371



Ver Perfil WWW
Re: Dimensión de Arreglos en C
« Respuesta #28 en: 27 Septiembre 2011, 23:35 pm »

Por lo visto tenemos una confusión, a ver si ahora me explico mejor.

Cuando indique que el proceso no es acumulativo me refería a la llamada a "malloc", no al incremento del contador "i".

Cuando se reserva memoria la variable "arreglo" sirve como bandera para saber si la reserva fue exitosa o no. Después de ello se libera pero eso no importa porque basta con revisar el valor de esa variable para conocer si funciono (diferente de NULL) o no (NULL).

Si por curiosidad se desea conocer si es posible realizar la máxima (en teoría) reserva de memoria basta con:
Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. int main(void)
  5. {
  6.   size_t max = -1;
  7.   char *p;
  8.  
  9.   p = malloc(max);
  10.   free(p);
  11.  
  12.   if (p)
  13.      puts("OK");
  14.   else
  15.      puts("Error");
  16.  
  17.   return EXIT_SUCCESS;
  18. }
El programa anterior de naderST realiza (poco mas o poco menos) lo mismo: acercarse al punto donde la reserva de memoria falle.

Un saludo

Cierto, my bad, no se por que veia un 1 en donde es una i (malloc), no dormir hace estragos XD
En línea

Páginas: 1 2 [3] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Matriz de N dimension, como imprimir vertice inferior derecho ?
Java
rub'n 2 3,438 Último mensaje 30 Noviembre 2011, 05:26 am
por rub'n
Problema en Dell Dimension 4600
Hardware
GITANASSO 1 3,264 Último mensaje 16 Octubre 2012, 16:51 pm
por Aprendiz-Oscuro
Ani-Dimension hack wpe pro
Juegos y Consolas
maelstron2 3 7,537 Último mensaje 13 Diciembre 2012, 00:28 am
por giankrlos26
¿Nos movemos a traves de una dimension estatica?
Foro Libre
erest0r 6 2,890 Último mensaje 29 Agosto 2014, 19:24 pm
por erest0r
Resolvedor de SUDOKU de cualquier dimension
Java
velectronico 0 1,424 Último mensaje 25 Enero 2019, 12:40 pm
por velectronico
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines