Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c++] puntatori e assegnamenti

    ciao a tutti!

    ho dichiarato due puntatori a string:
    codice:
    string* din_vett= new string[10];
    string* din_vett2= new string[20];
    per reallocare il primo vettore, siccome è meglio non usare la realloc( appartenente al C ), creo un nuovo puntatore a string sempre con la new.

    mi sapete spiegare perchè se io uso questo metodo:
    codice:
    din_vett2= din_vett1;
    il programma crasha?
    dopotutto ho assegnato la locazione di memoria puntata di din_vett alla locazione di memoria puntata da din _vett2.

    e come mai con:
    codice:
    *din_vett2= *din_vett;
    il programma funziona correttamente?

    grazie in anticipo
    Ultima modifica di MItaly; 29-09-2013 a 01:20

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Non ho capito bene ... cosa hai scritto ? Mostra il codice completo ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    era solo un programma in cui volevo vedere se era possibile creare in c++ ovviamente dei vettori dinamici di stringhe, siccome non ero sicuro poichè anche le stringhe sono trattate dinamicamente... il codice è composto proprio da due righe

    codice:
    #include <iostream>
    
    using namespace std;
    
    string* load_vector( string str_vector[], int parameter )
    {
        str_vector[parameter]= "hello";
        return str_vector;
    }
    
    main()
    {
        string vett_string[10];
        string* din_vett= new string[10];
        string* din_vett2= new string[20];
        int i= 0;
    
        for( int l= 0; l < 10; l++ )
          load_vector( vett_string, l );
    
        for( int m= 0; m < 10; m++ )
          cout << vett_string[m] << endl;
    
        cout << "------------------" << endl;
    
        din_vett2= din_vett;
    
        for( int l= 0; l < 20; l++ )
          load_vector( din_vett2, l );
    
        for( int m= 0; m < 20; m++ )
          cout << din_vett2[m] << endl;
    
        delete[] din_vett2;
        delete[] din_vett;
    }
    ma era solo un programma di prova per ricordarmi un attimo i puntatori con stringhe ecc...
    l'unica domanda è questa:

    din_vett2= din_vett;

    perchè deve dare problemi?
    a me andrebbe bene anche

    *din_vett2= *din_vett;

    ma credo che a livello di prestazioni sia più conveniente, ma soprattutto per curiosità ,preferisco capire il perchè?

    grazie della risposta

  4. #4
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,462
    Ma tu cosa pensi di fare esattamente con

    din_vett2= din_vett;

    ?
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  5. #5
    Appunto per quello:
    Avevo letto una volta che assegnare un puntatore a un altro puntatore aveva un significato ingannevole, ma non ricordo qual e?

    A prima vista mi verrebbe in mente che a din_vett2 assegno lo stesso indirizzo della locazione di memoria puntata da din_vett, pero sicuramente non e cosi:
    L unica idea che mi viene in mente è che siccome è un puntatore ad una string, il compilatore questa scrittura :

    *Din_vett la interpreta come il puntatore al primo elemento

    Mi potresti spiegare il vero significato di din_vett2= din_vett?

  6. #6
    Anzi
    Din_vett2= din_vett
    Forse significa che assegno la stringa din_vett a din_vett2
    E quindi se io facessi un cast su entrambi i puntatori : ( void * )
    Dovrebbe finzionare?

  7. #7
    A prima vista mi verrebbe in mente che a din_vett2 assegno lo stesso indirizzo della locazione di memoria puntata da din_vett, pero sicuramente non e cosi...
    Invece è proprio così. In quel modo tu assegni l'indirizzo di din_vett a din_vett2.

    Il problema viene qui:
    codice:
        for( int l= 0; l < 20; l++ )
          load_vector( din_vett2, l );
    Infatti tu consideri din_vett2 come un puntatore ad un vettore di 20 elementi, ma in realtà sta puntando a din_vett che è di 10 elementi.

    Nota bene che quando assegni l'indirizzo di din_vett a din_vett2 non deallochi la memoria precedentemente puntata da din_vett2. Inoltre se alla fine din_vett2 sarà uguale a din_vett allora dovrai chiamare una volta delete[], altrimenti cerchi di deallocare la stessa area di memoria due volte.

  8. #8
    grazie mille!
    proprio non ci avevo pensato...
    grazie ancora della tua disponibilità!

  9. #9
    Prego!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.