+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 6 su 6

[C/C++] Spiegazione su puntatore char*

  1. #1
    gheldrya non è in linea Scolaretto
    Post
    349
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao, mentre eseguivo qualche test sulle string functions mi sono ritrovato di fronte ad una situazione alla quale non riesco proprio a dare una spiegazione.
    #include<windows.h>
    #include<iostream>
    using namespace std;
    int main(){

    char* m=new char[20];

    m="CiAo MoNdO";

    CharLowerBuff(m,20);

    cout<<m;
    }
    Se io compilo questo frammento di codice il compilatore non mi riporta nessun errore nè warning. Però nel momento in cui eseguo il programma si apre immediatamente il debugger del Visual Studio e il programma termina senza neppure iniziare. Se io però sostituisco l'assegnazione diretta m="CiAo MoNdO" con lstrcpy(m,"CiAo MoNdO") tutto funziona correttamente.
    Qualcuno sa spiegarmi il motivo?Io ho utilizzato già in altre occasioni l'assegnazione diretta dei puntatori e non ho mai riscontrato problemi perchè con l'utilizzo delle string functions si verifica ciò?

  2. #2
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Post
    4,130
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao,

    C'e' una differenza notevole tra quello che hai scritto e la lstrcpy... andiamo a spiegare nel dettaglio.

    Una stringa tra apici "" è una porzione di memoria che il compilatore riserva. E'fissa e non può essere modificata. La stringa in sé è rappresentata da un puntatore a char e può essere assegnata ad un qualsiasi char*.
    Il motivo per cui ottieni errori è che cerchi con la CharLowerBuf di accedere in scrittura a quella che è praticamente una costante srtringa.

    Col codice che hai scritto, il puntatore m (che puntava a memoria allocata con la new) viene semplicemente sovrascritto da un puntatore alla stringa "ciao mondo". Il che tra l'altro fa si che tu perda la memoria allocata (non potrai invocare la delete perché hai perso il puntatore).

    La lstrcpy invece copia in una zona di memoria il contenuto di un altro char*... in quel caso ottieni quello che pensavi di ottenere. Il contenuto della stringa "ciao mondo" viene copiato nel buffer che hai allocato.
    Nel caso di un assegnamento fra char* hai semplicemente che sovrascrivi il vecchio puntatore con il nuovo.

    Ciaociao
    Ultima modifica di bottomap; 02-12-2010 23:54 
    ℹ️ Leggi di più su bottomap ...

  3. #3
    gheldrya non è in linea Scolaretto
    Post
    349
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quindi in pratica se ho capito bene quando assegno una stringa tra apici ad un puntatore char* sovrascrive tutto ciò che c'era già in precedenza e da quel momento il puntatore diventa una sorta di const char* cioè accessibile solo ed esclusivamente in lettura?

  4. #4
    L'avatar di bottomap
    bottomap non è in linea Amanuense
    Post
    4,130
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao,
    Si... facciamo un esempio... tieni presente che un puntatore è un numero intero che referenzia una cella di memoria, niente di più:

    char *a=NULL; //Qui a punta alla cella 00000000 - il NULL, per default ogni accesso a tale cella è vietato.
    a=new char[20]; //La new crea una zona di memoria, diciamo a 00001000 e restituisce il puntatore
    // a -> 00001000
    a="Pippo"; //Pippo è una zona di memoria, diciamo 00002000 ed è memoria accessibile in sola lettura.
    // a-> 00002000 NB: 1000 non è più referenziato, l'hai perso.
    Da qui in poi accedere in scrittura ad a è un operazione errata.

    La lstrcpy invece prende due zone e copia il contenuto dell'una sul contenuto dell'altra... il puntatore non viene modificato, per cui:
    lstrcpy(a,"pippo"); //Copia su 00001000 da 00002000, ma a continua a puntare a 1000, semplicemente il contenuto delle celle di memoria viene modificato.

    In sostanza, l'assegnamento da un valore alla variabile (assegnare un puntatore significa dare un valore all'intero in esso contenuto), la lstrcpy invece scrive sul contenuto del puntatore...

    Ciaociao
    Ultima modifica di bottomap; 02-12-2010 23:56 
    ℹ️ Leggi di più su bottomap ...

  5. #5
    gheldrya non è in linea Scolaretto
    Post
    349
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie per l'ottima spiegazione.

  6. #6
    Hyde non è in linea Scolaretto
    Post
    325
    Like Inviati  
    0
    Like Ricevuti  
    0
    Difficile trovare spiegazioni così chiare in giro per i forum.
    ℹ️ Leggi di più su Hyde ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Spiegazione formula
    Da niccoflo nel forum Microsoft Excel
    Risposte: 10
    Ultimo Post: 17-11-2013, 22:36
  2. Risposte: 6
    Ultimo Post: 21-03-2011, 11:06
  3. Spiegazione enabled
    Da lorepc88 nel forum Visual Basic 6
    Risposte: 6
    Ultimo Post: 27-04-2006, 16:32
  4. spiegazione sui Cicli for
    Da Smith nel forum Visual Basic 6
    Risposte: 4
    Ultimo Post: 26-12-2005, 10:24
  5. [Win32] lParam come puntatore a char
    Da lucagalbu nel forum C/C++
    Risposte: 4
    Ultimo Post: 19-07-2005, 15:03