No aspetta un momento, lascia perdere gli hard disk (che poi dipende da altri fattori ciò che dici, come il file system utilizzato).
Innanzitutto se la stringa è davvero
molto grande, non puoi utilizzare lo stack (come ho fatto nel mio esempio), ma dovrai allocare memoria sufficiente (utilizzando malloc/calloc).
La memoria è contigua:
char str[4] = "ciao";
str[0] = 'c';
str[1] = 'i';
str[2] = 'a';
str[3] = 'o';
Allo stesso modo se utilizzi l'aritmetica dei puntatori è uguale.
Anche se allochi memoria nell'heap con calloc/malloc viene allocata memoria virtuale contigua.
Se allochi sullo stack devi creare uno stack grande abbastanza (attenzione perchè c'è un limite... 1MB se non erro, fatto salvo specifiche differenti al momento della compilazione), altrimenti andrai a scrivere in aree di memoria adiacenti.
Usando sempre l'esempio qui sopra: se in str (che è grande 4byte) ne vai a copiare 10, i 6byte in eccesso vanno a sovrascrivere altre aree dello stack (il che significa che potresti sovrascrivere anche delle variabili che hai dichiarato dopo, o altro ancora). Diciamo che sei fortunato quando crasha, perchè diversamente è difficile trovare l'errore...
Le quadre che usi per indirizzare sono solo "zucchero sintattico". E non avviene nessun bounds-checking; se scrivi *(str+100), verrà calcolato l'indirizzo str+100.
Diciamo che l'indirizzo virtuale di str è 0x1234.
Codice:
str[0] è uguale a *(str+0) -> 0x1234 + 0 = 0x1234
str[1] è uguale a *(str+1) -> 0x1234 + 1 = 0x1235
...
a basso livello infatti avviene una cosa come questa:
[str + (i * sizeof(char))]
Inutile comunque dire che è un modo
scorretto per leggere da file (quello che stai utilizzando). Devi ottenere un handle al file e leggerne il contenuto.