Curiosità sui puntatori

di il
57 risposte

Curiosità sui puntatori

Salve a tutti
sappiamo tutti che con
char *nomevariabile;
,definizione di un puntatore di tipo char, si definisce una stringa di dimensioni teoricamente "infinita".
le mie curiosità sono:
come fa il sistema ad accorgersi che la variabile definita non vada, per errore, a ricoprire aree di memoria riservate?
come si potrebbe evitare una collisione di variabili nel seguente caso?

char *a;
char *b;
grazie anticipatamente per le risposte che mi darete

57 Risposte

  • Re: Curiosità sui puntatori

    Semplice.
    Non se ne accorge né se ne cura
  • Re: Curiosità sui puntatori

    Ma così almeno nel primo quesito,teoricamente, si avrebbe un paradosso!
    e cioè che i dati andrebbero a ricoprire le istruzioni che li generano!
    con conseguenze che potrebbero essere nefande per il sistema.
  • Re: Curiosità sui puntatori

    E nel caso del paradosso il sistema come fa a bloccare il tred per difesa?
  • Re: Curiosità sui puntatori

    I dati non vanno a ricoprire istruzioni perché nel segmento del codice non puoi scrivere.
    Semmai potresti ricoprire altri dati del processo (solo per indirizzi validi).
    Se sconfini in indirizzi non allocati al processo, ottieni una eccezione.

    Se leggi il manuale delle CPU Intel x86 x64 trovi tutto
  • Re: Curiosità sui puntatori

    Grazie per la risposta
    c'è un sistema per evitare che un puntatore sovrascriva un altro puntatore?
  • Re: Curiosità sui puntatori

    I puntatori non sovrascrivono puntatori.

    Vengono sovrascritti dei dati tramite puntatori.

    No, non c'è un sistema valido. Bisogna fare attenzione a come si scrive il codice. Se allochi 20 byte, devi trattare sempre, al massimo, 20 byte.

    Ma dove porta questa tua discussione? Perché lo chiedi?

    E comunque, dato che hai nozioni di Assembly, perché pensi che in C sia diverso da come funziona in Assembly?
  • Re: Curiosità sui puntatori

    Ma la comodità e la praticità dei puntatori stà proprio nel non sapere quanti byte allocare!
    se la dimensione è nota si crea un semplice array di x caratteri e si gestiscono solo quelli!
    il problema stà prorio nel evitare che i dati di una variabile "puntatore" vengano scritti da un altra variabile "puntatore"
  • Re: Curiosità sui puntatori

    Non è vero. Sai sempre quanti byte allocare, ovvero il codice lo sa sempre. La dimensione è nota ma stabilita a runtime.

    Continuo a non capire i tuoi problemi. Finché non sarai chiaro ed esporrai qualche dubbio con del codice specifico ...
  • Re: Curiosità sui puntatori

    smalldragon ha scritto:


    il problema stà prorio nel evitare che i dati di una variabile "puntatore" vengano scritti da un altra variabile "puntatore"
    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
  • Re: Curiosità sui puntatori

    La questione è come evitare una teorica collisione tra due variabili puntatore o che una variabile puntatore travolga un altra povera variabile di altro tipo.
    esempio che in pratica non serve a nulla ma che in teoria potrebbe causare il problema da me citato.
    
    int c,d;c=0;d=0;
    char *a;
    char *b;
    int e;
    for (c=0;c<999;c++)
    {
    d=pow(c,c);
    a[d]='a';
    }
    
  • Re: Curiosità sui puntatori

    Weierstrass ha scritto:


    smalldragon ha scritto:


    il problema stà prorio nel evitare che i dati di una variabile "puntatore" vengano scritti da un altra variabile "puntatore"
    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!
  • Re: Curiosità sui puntatori

    smalldragon ha scritto:


    La questione è come evitare una teorica collisione tra due variabili puntatore o che una variabile puntatore travolga un altra povera variabile di altro tipo.
    esempio che in pratica non serve a nulla ma che in teoria potrebbe causare il problema da me citato.
    
    int c,d;c=0;d=0;
    char *a;
    char *b;
    int e;
    for (c=0;c<999;c++)
    {
    d=pow(c,c);
    a[d]='a';
    }
    
    In questo tuo esempio non usi mai il puntatore b quindi non capisco cosa c'entri. Comunque, scrivi casualmente in memoria, dato che non hai allocato spazio dinamicamente per il puntatore a. E ovviamente potrai avere un crash.

    Questo tipo di programmazione è sbagliata, ovviamente, ma è compito del programmatore evitare queste "schifezze".

    Ma, ripeto, è un po' come l'Assembly, con cui puoi scrivere cose del genere senza problemi. E non mi pare tu abbia mai avuto problemi del genere.
  • Re: Curiosità sui puntatori

    smalldragon ha scritto:


    Weierstrass ha scritto:


    smalldragon ha scritto:


    il problema stà prorio nel evitare che i dati di una variabile "puntatore" vengano scritti da un altra variabile "puntatore"
    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.
  • Re: Curiosità sui puntatori

    Beh i tempi cambiano!
    se allocavo spazio in memoria sapevo le dimensioni o quanto meno me le potevo calcolare!
    e quindi non era un esempio calzante!
    beh in assembly c'è la possibilità di tenere traccia degli indirizzi di tutte le variabili sia che esse siano definite nel segmento codice, naturalmente tenendo presente il sorgente, che quelle definite nel segmento dati purchè il modulo sia unico e naturalmente attivo.
    come si potrebbe fare la stessa cosa in c++?
Devi accedere o registrarti per scrivere nel forum
57 risposte