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

Error de segmentación al rellenar memoria dinámica

Estas en el tema de Error de segmentación al rellenar memoria dinámica en el foro de C/C++ en Foros del Web. Hola amigos, hice un pequeño código en C para obtener el mcm y el mcd de varios números y el fallo que tengo es al ...
  #1 (permalink)  
Antiguo 10/03/2018, 07:21
 
Fecha de Ingreso: febrero-2015
Mensajes: 400
Antigüedad: 3 años, 6 meses
Puntos: 3
Error de segmentación al rellenar memoria dinámica

Hola amigos, hice un pequeño código en C para obtener el mcm y el mcd de varios números y el fallo que tengo es al rellenar el array dinámico, me da un error de segmentación. La función es getArray. Aquí mi código:

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. /*
  5. Función que muestra el menu principal
  6. */
  7. int menu(void){
  8.     int op;
  9.     system("CLS");
  10.     printf("1-Maximo Comun Divisor\n");
  11.     printf("2-Minimo Comun Multiplo\n");
  12.     printf("0-salir\n");
  13.     printf("\n");
  14.     printf("Elige una opcion: ");
  15.     scanf("%d",&op);
  16.     return op;
  17. }
  18.  
  19. /*
  20. Función que obtiene el array con los valores
  21. */
  22. int getArray(int **num){
  23.     int i,size;
  24.     if(*num!=NULL){
  25.         free(*num);
  26.         *num=NULL;
  27.     }
  28.     printf("Ingrese el numero de valores: ");
  29.     scanf("%d",&size);
  30.     *num=malloc(sizeof(int)*size);
  31.     for(i=0;i<size;i++){
  32.          printf("Ingrese numero: ");
  33.          scanf("%d",num[i]);
  34.     }
  35.     return size;
  36. }
  37.  
  38. /*
  39. Función principal
  40. */
  41. int main(void) {
  42.     int *num=NULL,i,op,salir=0;
  43.     do{
  44.         op=menu();
  45.         switch(op){
  46.             case 1:
  47.                 i=getArray(&num);
  48.                 printf("El M.C.D es: %d\n",mcd(num,i));
  49.                 break;
  50.             case 2:
  51.                 i=getArray(&num);
  52.                 printf("El M.C.M es: %d\n",mcm(num,i));
  53.                 break;
  54.             case 0:
  55.                 printf("Pulsa intro para salir");
  56.                 salir=1;
  57.                 break;
  58.             default:
  59.                 printf("Opcion incorrecta. Pulse intro para volver a intentarlo.\n");
  60.        }
  61.        system("PAUSE");
  62.        if(num!=NULL){
  63.            free(num);
  64.            num=NULL;
  65.        }
  66.     }while(salir !=1);
  67.     return 0;
  68. }
  69.  
  70. /*
  71. Función para calcular el mayor de x números
  72. */
  73. int max(int *num,int size) {
  74.     int i,mayor=0;
  75.     for(i=0;i<size;i++){
  76.         if (num[i]>mayor) {
  77.             mayor=num[i];
  78.         }
  79.     }
  80.     return mayor;
  81. }
  82.  
  83. /*
  84. Función para calcular el menor de x números
  85. */
  86. int min(int *num, int size) {
  87.     int i,menor=num[0];
  88.     for(i=0;i<size;i++){
  89.         if (num[i]<menor) {
  90.             menor=num[i];
  91.         }
  92.     }
  93.     return menor;
  94. }
  95.  
  96. /*
  97. Función para hallar el Máximo Común Divisor por fuerza bruta
  98. */
  99. int mcd(int *num, int size) {
  100.     int mcd = 1,contador,i;
  101.     int b = min(num, size);
  102.     do {
  103.         contador=0;
  104.         for(i=0;i<size;i++){
  105.             if(num[i]%b==0){
  106.                 contador++;
  107.             }
  108.         }
  109.         if(contador==size){
  110.             mcd=b;
  111.         }
  112.         b--;
  113.     } while(contador !=size);
  114.     return mcd;
  115. }
  116.  
  117. /*
  118. Función para hallar el Mínimo Común Múltiplo por fuerza bruta
  119. */
  120. int mcm(int *num, int size) {
  121.     int mcm = 0,j=1,contador,i;
  122.     int b = min(num, size);
  123.     do{
  124.         contador=0;
  125.         mcm=b*j;
  126.         for(i=0;i<size;i++){
  127.             if(mcm%num[i]==0){
  128.                 contador++;
  129.             }
  130.         }
  131.         j++;
  132.    }while (contador !=size);
  133.     return mcm;
  134. }
  #2 (permalink)  
Antiguo 10/03/2018, 10:24
 
Fecha de Ingreso: febrero-2015
Mensajes: 400
Antigüedad: 3 años, 6 meses
Puntos: 3
Respuesta: Error de segmentación al rellenar memoria dinámica

Solucionado con esto:
Código PHP:
scanf("%d",&((*num)[i])); 
  #3 (permalink)  
Antiguo 29/03/2018, 01:49
Avatar de Chofis  
Fecha de Ingreso: mayo-2013
Mensajes: 5
Antigüedad: 5 años, 4 meses
Puntos: 0
Respuesta: Error de segmentación al rellenar memoria dinámica

Gracias por la aportación, sera de mucha ayuda para mis clases de lenguaje C.



La zona horaria es GMT -6. Ahora son las 21:18.