Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Core dump usando malloc
Forum - C/C++ - Core dump usando malloc

Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 20:47
Martedì, 16/12/2014
Ciao a tutti, ho questo frammento di codice:

Codice sorgente - presumibilmente C++

  1. int nval, nval2, i;
  2.   int *arr, *arr2;
  3.  
  4.   do{
  5.     scanf("%d", &nval);
  6.   }while (nval < 0 || nval > N);
  7.  
  8.   if (arr = (int*)malloc(nval*sizeof(int))){
  9.     for (i = 0; i < nval; i++)
  10.       scanf("%d", arr+i);



Il problema sorge nel popolare l'array di interi. Ottengo "core dump. Errore di segmentazione" quando acquisisco l'ultimo degli nval valori che devono essere acquisiti. Il problema è che questo non avviene sempre. Avviene quando nval è maggiore di 3.
Qualcuno sa la causa di questo errore? Può essere un problema di deallocazione della memoria (free) ? Grazie.

PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 20:58
Martedì, 16/12/2014
Il problema non è in quella parte di codice ...

Mostra il resto


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 21:00
Martedì, 16/12/2014
Testo quotato

Postato originariamente da nessuno:

Il problema non è in quella parte di codice ...

Mostra il resto



Posto l'intero codice:

Codice sorgente - presumibilmente C++

  1. #include <stdio.h>
  2. #include <malloc.h>
  3.  
  4. #define N 30
  5.  
  6. int arrayMaggiori(int*, int, int**);
  7.  
  8. int main(int argc, char*argv[]){
  9.   int nval, nval2, i;
  10.   int *arr, *arr2;
  11.  
  12.   do{
  13.     scanf("%d", &nval);
  14.   }while (nval < 0 || nval > N);
  15.  
  16.   if (arr = (int*)malloc(nval*sizeof(int))){
  17.     for (i = 0; i < nval; i++)
  18.       scanf("%d", &arr[i]);
  19.    
  20.     nval2 = arrayMaggiori(arr, nval, &arr2);
  21.    
  22.     free(arr);
  23.    
  24.     if (nval2 > 0){
  25.       /*mostro la dimensione*/
  26.       printf("\n%d", nval2);
  27.       /*mostro i valori*/
  28.       printf("\n");
  29.       for (i = 0; i < nval2; i++)
  30.         printf("%d ", *(arr2+i));
  31.     }else if (nval2 == -2)
  32.       printf("\nErrore allocazione memoria secondo vettore");
  33.     else if (nval2 == -1)
  34.       printf("\nNessun valore inserito!");
  35.      
  36.   }else
  37.     printf("\nErrore allocazione memoria primo vettore");
  38.  
  39.   free(arr2);
  40.   return 0;
  41. }
  42.  
  43.  
  44. /*ritorna la dimensione del nuovo array; -2 se l'allocazione è fallita; -1 se l'array passato non ha elementi*/
  45. int arrayMaggiori(int* v, int dim, int** newv){
  46.   int i, j, somma, newdim;
  47.   float media;
  48.  
  49.   if (dim){
  50.     /*calcolo somma*/
  51.    
  52.     for (i = 0, somma = 0; i < dim; i++)
  53.       somma += *(v+i);
  54.    
  55.     /*calcolo media*/
  56.     media = (float)somma/dim;
  57.    
  58.    
  59.    
  60.     /*calcolo nuova dimensione*/
  61.     for (i = 0, newdim = 0; i < dim; i++)
  62.       if (*(v+i) > media)
  63.         newdim++;
  64.    
  65.     /*alloco*/
  66.     if (*newv = (int*)malloc(sizeof(int)*newdim)){
  67.       for (i = 0, j = 0; i < dim; i++)
  68.         if (*(v+i) > media){
  69.           **(newv+j) = *(v+i);
  70.           j++;
  71.         }
  72.     }else
  73.       return -2;
  74.    
  75.     return newdim;
  76.   }
  77.  
  78.   return -1;
  79. }



Ovviamente lo scopo del codice è mostrare solo gli elementi che siano maggiori della media degli elementi dell'array passato.

P.S: Avevo l'impressione che l'errore fosse in quella parte di codice perché se per esempio si mette un printf("ciao") subito dopo la visualizzazione di ciascun elemento, "ciao" viene mostrato dopo ogni elemento mostrato ad eccezione che dell'ultimo.

Ultima modifica effettuata da bruno.demarini il 16/12/2014 alle 21:04
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:04
Martedì, 16/12/2014
Non ho avuto il tempo di esaminare tutto il codice ma l'errore avviene in questa riga

**(newv+j) = *(v+i);


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
nessuno (Normal User)
Guru^2


Messaggi: 6402
Iscritto: 03/01/2010

Segnala al moderatore
Postato alle 21:33
Martedì, 16/12/2014
Probabilmente volevi scrivere

*(*newv+j) = *(v+i);


Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
PM Quote
Avatar
bruno.demarini (Normal User)
Pro


Messaggi: 84
Iscritto: 22/03/2010

Segnala al moderatore
Postato alle 21:38
Martedì, 16/12/2014
Testo quotato

Postato originariamente da nessuno:

Non ho avuto il tempo di esaminare tutto il codice ma l'errore avviene in questa riga

**(newv+j) = *(v+i);



Grazie mille, ho capito l'errore! Si deve invece scrivere:

*(*newv+j) = *(v+i);

Grazie ancora, ciao!

P.S: Non mi ero accorto della tua aggiunta! Ciao ;)

Ultima modifica effettuata da bruno.demarini il 16/12/2014 alle 22:23
PM Quote