Array nello stack

di il
20 risposte

Array nello stack

Buonasera,

pensavo di aver capito l'allocazione di memoria dello stack invece probabilmente ho preso un abbaglio. Pensavo che la quantità di memoria da allocare per uno stack di una funzione fosse decisa a tempo di compilazione, invece ho verificato che posso allocare un array di dimensione n, con n intero il cui valore lo prendo dallo standard input. Quindi la dimensione dello stack viene decisa a tempo di esecuzione?

Grazie

20 Risposte

  • Re: Array nello stack

    No sei nella heap e tale diavoleria è permessa dallo standard c'99, non portabile e sicuramente deprecato
  • Re: Array nello stack

    vbextreme ha scritto:


    no sei nella heap e tale diavoleria è permessa dallo standard c'99, non portabile e sicuramente deprecato
    Ah quindi avevo capito bene. In ansi C non è permesso? E scusa una cosa, perché sono nell'heap? Il compilatore mette automaticamente nell'heap quando vede una cosa del genere anche se non faccio la new?
  • Re: Array nello stack

    Si è sempre ANSI ma c'99, sempre stato sconsigliato.
    new in c non esiste, al massimo malloc.
    si di tutto il contorno se ne preoccupa il compilatore.
  • Re: Array nello stack

    vbextreme ha scritto:


    si è sempre ANSI ma c'99, sempre stato sconsigliato.
    new in c non esiste, al massimo malloc.
    si di tutto il contorno se ne preoccupa il compilatore.
    Visto che ci sono, un altro paio di domande in tema. Ho provato pure a inizializzare una costante con un valore preso dallo standard input, e me lo ha fatto fare. La seconda domanda riguarda le stringhe definite come char*: anche in questo caso sono nell'heap?
  • Re: Array nello stack

    Le costanti garantiscono che dopo l assegnazione il valore non cambi, è poi compito del compilatore decidere dove posizionarli.
    Con char* definisco un puntatore a char e non una stringa, tale puntatore è contenuto nello stack, forse tu ti riferivi ad
    char* s="ciao mondo";
    quel ciao mondo sarà contenuto dove riterrà più opportuno il compilatore ma presibilmentw nella stessa posizione delle costanti.
  • Re: Array nello stack

    vbextreme ha scritto:


    le costanti garantiscono che dopo l assegnazione il valore non cambi, è poi compito del compilatore decidere dove posizionarli.
    Con char* definisco un puntatore a char e non una stringa, tale puntatore è contenuto nello stack, forse tu ti riferivi ad
    char* s="ciao mondo";
    quel ciao mondo sarà contenuto dove riterrà più opportuno il compilatore ma presibilmentw nella stessa posizione delle costanti.
    Per quanto riguarda la prima domanda era legata alla dimensione dell'array. Da quanto ho capito dalla tua spiegazione, se inizializzo in questo modo una costante, poi non posso metterla come dimensione dell'array (tranne nello standard c99).
    Per quanto riguarda la stringa, sì, intendo:
    char* s;
    cout << "Inserisci una stringa" << endl;
    cin >> s;
  • Re: Array nello stack

    Se scrivi in quel modo hai un sicuro crash.

    Non puoi usare un puntatore senza allocare prima la memoria.

    Per quanto riguarda l'allocazione di un array con valore indicato da tastiera a runtime, è una caratteristica dello standard C99 e ha un nome preciso : VLA. Ti consiglio di leggere questo

    http://en.wikipedia.org/wiki/Variable-length_arra

    e poi approfondire.
  • Re: Array nello stack

    oregon ha scritto:


    Se scrivi in quel modo hai un sicuro crash.

    Non puoi usare un puntatore senza allocare prima la memoria.

    Per quanto riguarda l'allocazione di un array con valore indicato da tastiera a runtime, è una caratteristica dello standard C99 e ha un nome preciso : VLA. Ti consiglio di leggere questo

    http://en.wikipedia.org/wiki/Variable-length_arra

    e poi approfondire.
    Grazie, leggerò. Per quanto riguarda le stringhe, no, ho verificato che non ho un crash, piuttosto il problema è un altro: rischio di sovrascrivere o di essere sovrascritto. A questo punto mi viene da pensare che la stringa stia nello stack. E di conseguenza la domanda: come è possibile?
  • Re: Array nello stack

    Autodidatta ha scritto:


    oregon ha scritto:


    Se scrivi in quel modo hai un sicuro crash.

    Non puoi usare un puntatore senza allocare prima la memoria.

    Per quanto riguarda l'allocazione di un array con valore indicato da tastiera a runtime, è una caratteristica dello standard C99 e ha un nome preciso : VLA. Ti consiglio di leggere questo

    http://en.wikipedia.org/wiki/Variable-length_arra

    e poi approfondire.
    Grazie, leggerò. Per quanto riguarda le stringhe, no, ho verificato che non ho un crash, piuttosto il problema è un altro: rischio di sovrascrivere o di essere sovrascritto. A questo punto mi viene da pensare che la stringa stia nello stack. E di conseguenza la domanda: come è possibile?
    Scusa, hai ragione, ho un crash. In questo momento non mi risordo più qual è il dubbio che avevo quando faccio una stringa come char*.
  • Re: Array nello stack

    Autodidatta ha scritto:


    no, ho verificato che non ho un crash
    Non so da quanto programmi in C ma non ti fidi tanto di chi magari lo conosce da qualche decina d'anni più di te ...
  • Re: Array nello stack

    oregon ha scritto:


    Autodidatta ha scritto:


    no, ho verificato che non ho un crash
    Non so da quanto programmi in C ma non ti fidi tanto di chi magari lo conosce da qualche decina d'anni più di te ...
    Se non mi fidassi non sarei qui a domandare. Mi ero confuso col fatto che, quando faccio una stringa come char*, rischio che sia sovrascritta (di questo sono sicuro). Sai come mai?
  • Re: Array nello stack

    Con char* non fai una stringa!
    Con char* PUNTI ad una stringa, e non è detto che tu la possa modificare.
    
    char* str = "Ciao mondo";
    
    questo è il frammento di codice che inganna quasi tutti, in realtà il compilatore salva la scritta "Ciao Mondo" in un'area della memoria (molto probabilmente in quella del codice, ma non è detto) con "char* str" tu punti a quell'area della memoria ed accedi li, a seconda del compilatore potrai o meno editarla.
    Ad esempio gcc la crea nell'area del codice e quindi impossibile da modificare e dunque una cosa come questa:
    
    *str = '\0';
    
    provocherà un errore, in Digital Mars invece la stringa viene salvata nell'heap ( o comunque in un'area di memoria editabile) e quindi il codice scritto sopra funzionerà.
    è comunque buona regola per chi non conosce pienamente il proprio compilatore (cosa che bisognerebbe approfondire subito) pensare che le stringhe dichiarate in quel modo siano costanti e quindi non modificabili.
    Agli inizii aiuta molto scrivere
    
    const char* str = "Ciao Mondo";
    
    Anche se in realtà tale dicitura ha un significato diverso, ovvero un puntatore costante e non una stringa costante.
    In c poi non esistono lestringhe ma i vettori di caratteri, piccolo accorgimento di nomi che spesso aiuta ad imparare tali vettori correttamente
  • Re: Array nello stack

    Sono stato impreciso nella terminologia ma solo per brevità, il concetto l'avevo capito (giustamente tu non lo potevi sapere e hai fatto bene a precisare). Però la cosa che continuo a non capire è il meccanismo per cui, dovunque il compilatore metta la stringa, io ogni tanto me la trovi sovrascritta da qualcos'altro. Questo fatto è successo pure ad altre persone, non sono il solo. Se non compio errori di programmazione nell'uso di qualche puntatore non dovrebbe succedere questo. Sbaglio?
    Quello che hai scritto mi ha fatto venire in mente un'altra domanda: com'è possibile che il compilatore metta una stringa nell'area codice? Perché dovrebbe farlo?
    Grazie
  • Re: Array nello stack

    Sicuramente il codice che usi ha dei bug, bisognerebbe vederlo.

    I dati costanti e quindi non modificabili vengono messi nella area del codice perché è l'unica area della memoria teoricamente non modificabile.
    Teoricamente perché i consueti mainstream sono basati sulla classica architettura von Newman, avendo un unica area della memoria possono solo "emulare" la più robusta architettura Harvard con due distinte aree della memoria.
Devi accedere o registrarti per scrivere nel forum
20 risposte