Curiosità sui puntatori

di il
57 risposte

57 Risposte - Pagina 2

  • Re: Curiosità sui puntatori

    Già se ti vuoi salvare tutta un'area di memoria da una zona in un'altra, tipo la routine sicuramente presente in ogni progetto (anche se nascosta)
    	/* Copy initialized data from ROM to RAM */
    	while (n--)
    	*data_ram++ = *data_rom++;
    		
    farlo senza puntatori è un delirio.

    Poi da come parli sembra che heap o stack per te siano la stessa cosa.
    Ma comunque il puntatore è un indirizzo ad un'area di memoria: in ogni istante sai esattamente dove punta. C'è anche modo di sapere dove stiano in memoria tutte le variabili, registri e funzioni che vuoi, in ogni istante (scoprire come lo lascio a te). Se devi controllare tutto, poi però il codice non finisce più
  • Re: Curiosità sui puntatori

    Non ho capito nulla. Non ha molto senso quello che hai scritto snalldragon. Cosa vorresti fare? A che ti serve sapere dove stanno le variabili?

    Probabilmente ti mancano i concetti base del linguaggio.

    Pensa ai puntatori come i registri SI DI o BX quando usati per puntare a memoria
  • Re: Curiosità sui puntatori

    oregon ha scritto:


    smalldragon ha scritto:


    Weierstrass ha scritto:



    Quello che per te è un problema è un vantaggio per altri. Il tradeoff del C è quello che devi stare, appunto, attento TU a non fare cavolate coi puntatori, però il vantaggio è che puoi fare tutta una serie di cose scomode in altri linguaggi
    scusa la mia ignoranza ma non capisco il vantaggio di travolgere altre variabili!
    Non hai vantaggi a scrivere in aree non consentite/allocate. Il vantaggio è poter scrivere/leggere un po' ovunque (nell'ambito del processo), cosa che, a volte, può essere utile.

    Ripeto, esattamente come in Assembly.
    in assembler una volte per far comunicare tra loro 2 processi che non potevano essere entrambi attivi.
    una delle delle tecniche usate per farli lavorare con gli stessi dati era quella
    di "disperdere" delle variabili che poi venivano utilizzate dal altro processo.
    ma con il multitread e la quantità di memoria che si ha a disposizione oggi non serve più.
    a prescindere che oggi questa tecnica, che io sappia, non la si può più fare neanche in assembly.
  • Re: Curiosità sui puntatori

    Ma che c'entra questo discorso con i puntatori?

    Stai andando fuori tema e scrivi anche cose inesatte.

    Tornando al tuo problema.. qual è? Non l'ho ancora capito.
  • Re: Curiosità sui puntatori

    Sapere gli indirizzi delle variabili serve ad evitare che una variabile vada a scrivere su di un altra effettuando un controllo prima di scrivere.
    ora devo andare ci risentiamo domani
  • Re: Curiosità sui puntatori

    Ma no ... non serve ... ti stai perdendo in un bicchier d'acqua

    L'indirizzo ce l'hai con &var ma non ci fai nulla
  • Re: Curiosità sui puntatori

    In C E' la stessa cosa!
    Non c'e' nulla di miracoloso.

    Quando allocchi, SPECIFICHI quanto allocare. Quando liberi, IL SISTEMA SA quanto liberare. Questo vuol dire che in ogni momento il sistema sa quanto e' allocato e dove

    CORROMPI il sistema SOLO SE:

    1) liberi piu' volte lo stesso blocco di memoria allocato
    2) usi un blocco precedentemente liberato
    3) vai a scrivere OLTRE il blocco di memoria disponibile

    Se allochi e non rilasci mai, NON corrompi il sistema, SPRECHI spazio e basta.

    NON PUOI andare a scrivere nel segmento di codice perche' l'Intel ha la memoria "segmentata" e i segmenti di codice sono "read only".
    NON PUOI andare a scrivere nella memora di un'altro processo a meno di non passare attraverso il sistema operativo, perche' ogni processo e' isolato dagli altri ed ha un suo spazio di indirizzamento. Questo vuol dire che DUE processi distinti hanno LO STESSO spazio di indirizzamento, SEMPRE perche' la memoria e segmentata ed e' il SO che si occupa di assegare i configurare gli spazi di indirizzamento "locali"
  • Re: Curiosità sui puntatori

    migliorabile ha scritto:


    In C E' la stessa cosa!
    Non c'e' nulla di miracoloso.

    Quando allocchi, SPECIFICHI quanto allocare. Quando liberi, IL SISTEMA SA quanto liberare. Questo vuol dire che in ogni momento il sistema sa quanto e' allocato e dove

    CORROMPI il sistema SOLO SE:

    1) liberi piu' volte lo stesso blocco di memoria allocato
    2) usi un blocco precedentemente liberato
    3) vai a scrivere OLTRE il blocco di memoria disponibile

    Se allochi e non rilasci mai, NON corrompi il sistema, SPRECHI spazio e basta.

    NON PUOI andare a scrivere nel segmento di codice perche' l'Intel ha la memoria "segmentata" e i segmenti di codice sono "read only".
    NON PUOI andare a scrivere nella memora di un'altro processo a meno di non passare attraverso il sistema operativo, perche' ogni processo e' isolato dagli altri ed ha un suo spazio di indirizzamento. Questo vuol dire che DUE processi distinti hanno LO STESSO spazio di indirizzamento, SEMPRE perche' la memoria e segmentata ed e' il SO che si occupa di assegare i configurare gli spazi di indirizzamento "locali"
    stai fuori tema il problema non stà li!

    oregon ha scritto:


    Ma no ... non serve ... ti stai perdendo in un bicchier d'acqua

    L'indirizzo ce l'hai con &var ma non ci fai nulla
    e come dovrei fare per controllare che una variabile puntatore non sovrascriva altre variabili?
  • Re: Curiosità sui puntatori

    Non devi andare oltre lo spazio allocato ! Come in assembly te l'ho già detto!
  • Re: Curiosità sui puntatori

    Si questo lo so!
    voglio sperare che non mi stai consigliando di allocare manualmente tutte le variabili?
    ma come faccio a sepere quanto spazio è stato allocato,non da me, a quel puntatore?
  • Re: Curiosità sui puntatori

    smalldragon ha scritto:


    ma come faccio a sepere quanto spazio è stato allocato,non da me, a quel puntatore?
    Se il puntatore lo indirizzi a un'altra variabile, struttura etc. nello stack, ci sono gli strumenti per sapere indirizzo e lunghezza totale della variabile.

    Se lo indirizzi ad un'area nello heap, ovviamente lo fai solo con le malloc che hai usato tu stesso e quindi la dimensione la conosci, non vai di certo ad utilizzare le malloc degli altri, magari chiamate da altri programmi.
  • Re: Curiosità sui puntatori

    Per capirci
    nel caso più banale del mondo e cioè
    
    int b;
    char *a;
    int c;
    c=0;b=0;
    while (b=0)
    { a[c]=' '; c++; }
    
    premesso il ciclo è stato fatto a posta per essere infinito per dare l'opportunita alla variabile a di travolgere la variabile c!
    in questo caso come faccio a capire la dimensione della variabile a?
  • Re: Curiosità sui puntatori

    A parte che sarebbe b==0

    a ha dimensioni 4 byte o 8 byte (dipende se l'architettura è a 32 bit o 64) e sta puntando a 0. Stai tentando di scrivere in un'area vietata
  • Re: Curiosità sui puntatori

    @smalldragon ... sei abbastanza 'di coccio'

    Tu DEVI allocare lo spazio per a e sai quanti byte allochi altrimenti hai SUBITO un errore.

    Quel codice non lo scriverebbe mai nessun programmatore.
  • Re: Curiosità sui puntatori

    Weierstrass ha scritto:


    A parte che sarebbe b==0

    a ha dimensioni 4 byte o 8 byte (dipende se l'architettura è a 32 bit o 64) e sta puntando a 0. Stai tentando di scrivere in un'area vietata
    è stata distrazione il non mettere l'altro =!
    comunque a non stà puntando a 0, e di conseguenza non è un area vietata, ma sta puntando ad un indirizzo ben specifico + 0 .... altri incrementi.
    infatti se compili il programma, a parte la mancanza dell'altro =, il programma funziona e va in loop eterno.
Devi accedere o registrarti per scrivere nel forum
57 risposte