DOMANDA stringhe e puntatori in C

Pubblicità
Quindi in memoria i dati(tutto ciò che viene caricato in memoria?) si memorizzano in spazi contigui. Non lo sapevo. Grazie.

Questo non dipende dal linguaggio ma dalle primitive di allocazione di memoria che il sistema mette a disposizione. Ad esempio la malloc/calloc utilizzano API di basso livello del sistema operativo che restituiscono blocchi di memoria contigui.

memoria estesa (è quella che i programmatori chiamano Heap?)?

No, non si chiama memoria "estesa" e sì, a grandi linee la memoria viene allocata nell'heap di sistema.
 
Non sono in grado di seguirti per ora. Quindi le funzioni malloc e calloc hanno a che fare con la gestione della memoria estesa(è quella che i programmatori chiamano Heap?)?

In realtà non ho detto nulla di particolare, se non mostrarti che con o senza quadre l'indirizzo è sempre il medesimo; inoltre ho aggiunto che in C non avviene un controllo sugli indici degli array: quindi se hai un array di 10 elementi e accedi alla posizione 11, te lo fa fare.

Come dice theprogrammer, non si chiama "estesa".
malloc/calloc restituiscono un puntatore a della memoria allocata nell'heap, si (poi su cosa facciano davvero, è inutile parlarne ora, per non confonderti ulteriormente le idee).
 
Quello che cerchi di fare non è banale.
Certo, puoi reindirizzare l’input e usare scanf() per mettere il file in u a stringa (se il file è di testo) ma la stringa la devi allocare prima di usarla, e come fai ad allocarla se non sai la dimensione del file? E anche se sai la dimensione, devi accertarti che hai abbastanza memoria per allocarla, se il file è troppo grosso è possibile che non ce la fai, o se puoi poi il programma impiegherà un vita per allocare la memoria e leggere il file (in quanto scanf() legge in maniera formattata).

Ma a parte questo, l risposta alla tua domanda è si, in un programma vettori e stringhe (la stringa non è poi altro che un vettore) sono memorizzare in maniera contigua per cui accedere ai singoli elementi è estremamente veloce.
 
davvero strano! prova col copia-incolla del carattere corrispondente, te li lascio qui:
[
]
 
Quello che cerchi di fare non è banale.
Certo, puoi reindirizzare l’input e usare scanf() per mettere il file in u a stringa (se il file è di testo) ma la stringa la devi allocare prima di usarla, e come fai ad allocarla se non sai la dimensione del file? E anche se sai la dimensione, devi accertarti che hai abbastanza memoria per allocarla, se il file è troppo grosso è possibile che non ce la fai, o se puoi poi il programma impiegherà un vita per allocare la memoria e leggere il file (in quanto scanf() legge in maniera formattata).

Scusi la mia ignoranza. Quello che voglio dire è che comunque i byte presenti in memoria non vanno formattati per leggerli sotto forma di numeri, lettere, ecc...?

Ma a parte questo, l risposta alla tua domanda è si, in un programma vettori e stringhe (la stringa non è poi altro che un vettore) sono memorizzare in maniera contigua per cui accedere ai singoli elementi è estremamente veloce.

Per me è importante saperlo! Grazie.
--- i due messaggi sono stati uniti ---
davvero strano! prova col copia-incolla del carattere corrispondente, te li lascio qui:
[
]
[
]

Col copia e incolla vengono fuori
mentre con

str

scompaiono per l'appunto!(Già visto con l'anteprima)
 
Ultima modifica:
Per me è importante saperlo! Grazie.
È la caratteristica che definisce il concetto di array, insieme all’accesso degli elementi con complessità costante O(1).


Scusi la mia ignoranza. Quello che voglio dire è che comunque i byte presenti in memoria non vanno formattati per leggerli sotto forma di numeri, lettere, ecc...?
Sì chiaramente, ma credo che intenda che se vuoi leggere un file lettera per lettera e allocare lo spazio esatto ogni volta, ciò diventa complessivamente pesante per le ripetute chiamate a fscanf (e realloc pure). O almeno è quello che io interpreto.

Ma non ho capito come si è arrivati a questo. Il thread inizialmente parlava della conversione da array a puntatore.
 
È la caratteristica che definisce il concetto di array, insieme all’accesso degli elementi con complessità costante O(1).



Sì chiaramente, ma credo che intenda che se vuoi leggere un file lettera per lettera e allocare lo spazio esatto ogni volta, ciò diventa complessivamente pesante per le ripetute chiamate a fscanf (e realloc pure). O almeno è quello che io interpreto.

Ma non ho capito come si è arrivati a questo. Il thread inizialmente parlava della conversione da array a puntatore.

Comunque ci siamo arrivati per quanto riguarda la mia domanda.
 
Ma dove stati studiando il C? Hai un libro? Lo stai seguendo?

Avere le idee confuse va bene, ma si chiariscono solo studiando, non facendo domande senza molto senso.
 
Wow, vedo una massiccia confusione nei post di cuttyflam. Intanto perchè continui ad usare termini tipicamente del DOS, tipo "terminale del DOS" e "memoria estesa"?

Sono concetti che non dovrebbero far parte del libro che stai usando per studiare il C ( almeno spero ). E ti stanno portando fuori strada. Per esempio, quando dici che heap = memoria estesa, stai sbagliando di grosso.

Heap e stack sono due modi di gestire la memoria. E si, il sistema operativo si preoccupa d'individuare due aree di memoria distinte in cui "allocare" queste due tipologie di memoria ( termine improprio, ma lasciamolo passare ).

Il punto è che lo stack ( nella stragrande maggioranza dei linguaggi ) è gestito automaticamente dal runtime del linguaggio e non esplicitamente dal programmatore. Mentre l'heap si, nei linguaggi di sistema tipo C, C++, Rust, Pascal, D, ecc... In linguaggi come Python, nemmeno quello puoi gestire.

E qui si arriva a malloc/free/new/delete, che sono le funzioni e parole chiave per allocare/deallocare zone dell'heap, ottenendo puntatori all'inizio di tali zone.

La contiguità di cui parlavi, è presente in alcuni casi ma non sempre. Un array sta su un blocco contiguo di memoria ( che sia heap o stack, dipende da come l'hai dichiarato nel programma ). Una lista linkata non sta su un unico blocco contiguo di memoria, ma ha i suoi elementi sparpagliati in tutto l'heap.

Per tornare alla tua domanda iniziale, una variabile di tipo stringa ( char [] ) è un array di caratteri e tutte le variabili che fanno riferimento agli array, contengono in realtà l'indirizzo ( il puntatore ) della locazione di memoria dove inizia l'array. NON SONO PUNTATORI!!! Per accedere a s ( nel codice sotto ) scrivi s, non scrivi *s come faresti con un puntatore. Ma puoi applicare l'aritmetica dei puntatori a questi "riferimenti".

Quindi si, una variabile referente una stringa è un "puntatore" all'area di memoria contigua ( array di caratteri ) contenente la stringa.

E ovviamente puoi avere

C:
char s[] = "Ciao mondo";    // stringa allocata nello stack
char *t = malloc(1024);        // stringa allocata nell'heap

strncpy(t, s, strlen(s));

printf("s = %s\n", s+1);         // s+1 funziona, come se s fosse un puntatore!!
 
Memoria "estesa" e' una definizione PC dei tempi del gate A20. Non ha nulla a che vedere con il C. Non ti interessa quale memoria sia, malloc e calloc ovviamente le puoi usare in un micro 8 bit come in amd 64bit 24 thread. Meoria e' presa dall'heap, un "area" di memoria utilizzabile per allocazioni dinamiche.
--- i due messaggi sono stati uniti ---
E ovviamente puoi avere

C:
char s[] = "Ciao mondo";    // stringa allocata nello stack
char *t = malloc(1024);        // stringa allocata nell'heap

strncpy(t, s, strlen(s));

printf("s = %s\n", s+1);         // s+1 funziona, come se s fosse un puntatore!!

Non per fare la "pigna" che precisa sciocchezze, eh, ma buona norma sempre controllare il ritorno di malloc:

Codice:
char *t = malloc(1024);        // stringa allocata nell'heap

if (t) {
        strncpy(t, s, strlen(s));
  ... bla bla ...
}
E' solo buona pratica.
 
Ultima modifica da un moderatore:
Pubblicità
Pubblicità
Indietro
Top