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++ - Crash programma causato da una probabile errata gestione degli array dinamici
Forum - C/C++ - Crash programma causato da una probabile errata gestione degli array dinamici

Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 20:04
Giovedì, 17/11/2011
ho fatto questo banale programma che mediante la funzione scomponiInteroInSingoleCifre dovrebbe scomporre un intero passato come parametro in singole cifre e ritornare un puntatore all'array dinamico nel quale inserisco le varie cifre, il problema è che mentre cicla il numero per estrarne le cifre, crasha, dove sbaglio?
ho provato a debuggare, ma debuggando funziona(con vc++) e curiosamente funziona anche facendo compila ed esegui con dev...

Codice sorgente - presumibilmente C++

  1. #include<cstdlib>
  2. #include<iostream>
  3. #include<vector>
  4. #include<conio.h>
  5. using namespace std;
  6. int* scomponiInteroInSingoleCifre(int input)
  7. {
  8.     int* toRet=(int*)malloc(sizeof(int));
  9.         int* temp=(int*)malloc(sizeof(int));
  10.     int i=0;
  11.     do
  12.     {
  13.         *(toRet+i)=input%10;
  14.         i++;
  15.         input/=10;
  16.                 for(int j=0;j<i;j++)
  17.                         temp[j]=toRet[j];
  18.                 free(toRet);                                          //avevo evitato precedentemente questa cosa della variabile temp usando la realloc(), ma ora ho messo questa routine pensando che l'errore fosse proprio nella realloc, ma così non era...
  19.                 toRet=(int*)malloc(sizeof(int)*(i+1));
  20.                 for(int j=0;j<i;j++)
  21.                         toRet[j]=temp[j];
  22.                 free(temp);
  23.                 temp=(int*)malloc(sizeof(int)*(i+1));
  24.     }while(input/10>0||(input/10==0&&input%10!=0));
  25.     int* tr=(int*)malloc(sizeof(int)*i);
  26.     toRet[i]=-1;
  27.     for(int j=i-1;j>=0;j--)
  28.     tr[i-j-1]=toRet[j];
  29.     tr[i]=-1;
  30.     return tr;
  31. }
  32. int main()
  33. {
  34.     int input;
  35.     cout<<"Inserire un intero: ";
  36.     cin>>input;
  37.     int* print=scomponiInteroInSingoleCifre(input);
  38.     for(int i=0;print[i]!=-1;i++)
  39.     {
  40.                 cout<<print[i]<<" ";
  41.         }
  42.     cout<<"\nPremere un tasto per continuare . . .";
  43.     getch();
  44. }



Grazie in anticipo...

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 21:07
Giovedì, 17/11/2011
Perché tutto quel casino? Non riesco a tirare niente di buono da lì...

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. void numeroInCifre( int * cifre, int numero )
  4. {
  5.         int i = 0;
  6.  
  7.         while ( numero != 0 )
  8.         {
  9.                 cifre[ i ] = numero % 10;
  10.                 numero /= 10;
  11.                 i++;
  12.         }
  13.  
  14. }
  15.  
  16. int main()
  17. {
  18.         int vettore[ 8 ] =  { 0 };
  19.  
  20.         numeroInCifre( vettore, 123 );
  21.  
  22.         for ( int i = 7; i >= 0; i-- )
  23.         {
  24.                 std::cout << vettore[ i ] << " ";
  25.         }
  26.  
  27.         getchar();
  28.         return 0;
  29. }


PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 23:08
Giovedì, 17/11/2011
è una valida soluzione, ma io non vorrei usare array statici....

PM Quote
Avatar
tasx (Dev Team)
Expert


Messaggi: 439
Iscritto: 15/12/2008

Segnala al moderatore
Postato alle 16:19
Venerdì, 18/11/2011
Ciao!

Non vorrei dire una boiata ma:
Codice sorgente - presumibilmente C/C++

  1. int vettore[8] = {0};



non è uguale a:

Codice sorgente - presumibilmente C/C++

  1. int *vettore = malloc(sizeof(int) * 8);



ciaociao!!

PM Quote
Avatar
Pitagora (Member)
Expert


Messaggi: 367
Iscritto: 12/06/2010

Segnala al moderatore
Postato alle 19:53
Venerdì, 18/11/2011
Testo quotato

Postato originariamente da tasx:
Codice sorgente - presumibilmente C/C++

  1. int vettore[8] = {0};



non è uguale a:

Codice sorgente - presumibilmente C/C++

  1. int *vettore = malloc(sizeof(int) * 8);




Non esattamente.
E' uguale a:
Codice sorgente - presumibilmente C++

  1. int * const vettore = new int[ 8 ];
  2. int * const vettore = malloc( sizeof ( int ) * 8 );



PM Quote
Avatar
anthony015 (Member)
Pro


Messaggi: 116
Iscritto: 20/05/2011

Segnala al moderatore
Postato alle 17:10
Sabato, 19/11/2011
ho trovato l'errore, andavo fuori dalla capacità dell'array nel tentativo di inserire un numero, l'ho rifatta con la realloc, se volete posto il codice...

PM Quote