2013-07-08 17 views
5

Ho usato C per un bel po 'di tempo, e ho questo banale problema che voglio interrogare.È incluso il carattere nullo durante l'allocazione utilizzando malloc

Dire che voglio creare un array di caratteri che memorizza fino a 1000 caratteri. Ora, quando sto usando malloc per lo stesso, allora devo specificare la dimensione dell'array come 1001 caratteri [1000 caratteri + null] o solo 1000?

Inoltre, dire che mi sono imbattuto in questo problema, quindi come ho potuto trovare la risposta a questa soluzione da solo, magari utilizzando alcuni programmi di test. Capisco che la dimensione della stringa sia calcolata senza il carattere null, ma quando sto allocando la memoria per lo stesso, prendo in considerazione anche il carattere null?

risposta

7

Se è necessario il blocco per la memorizzazione di stringa con terminazione null, sì, è necessario chiedere esplicitamente a malloc() di allocare un byte aggiuntivo per la memorizzazione del terminatore null, malloc() non lo farà diversamente. Se si intende archiviare la lunghezza della stringa da qualche altra parte e quindi non è necessario il terminatore null, è possibile uscire senza allocare il byte aggiuntivo.Naturalmente dipende da te se hai bisogno di terminazione null per le stringhe, ma non dimenticare che le funzioni di gestione delle stringhe della libreria C funzionano solo con stringhe con terminazione nulla.

1

In effetti è necessario allocare la memoria per il terminatore null.

Concettualmente il terminatore null è solo un modo conveniente di contrassegnare la fine di una stringa. La libreria C standard sfrutta questa convenzione durante la modellazione di una stringa. Ad esempio, strlen calcola la lunghezza di una stringa esaminando la memoria dalla posizione di input (probabilmente un char *) finché non raggiunge un terminatore nullo; ma il terminatore null non è incluso nella lunghezza. Ma fa ancora parte della memoria consumata dalla stringa.

1

Sta a te fornire il carattere di terminazione nulla.

malloc alloca la memoria per te ma non imposta nulla.

Se si strcpy nella memoria allocata, si dispone di un terminatore null fornito per l'utente.

In alternativa, utilizzare calloc poiché imposterà tutti gli elementi su 0, che in effetti è il terminatore null. Quindi, se lo fai, per esempio, memcpy, non dovresti preoccuparti di terminare correttamente la stringa.

+2

Devi ancora considerare che il terminatore null ha bisogno di un byte extra, quindi se la tua stringa deve essere lunga un migliaio di caratteri, usare 'calloc()' non cambia il fatto che hai bisogno di mille e un byte per memorizzare la stringa. –

2

malloc e la famiglia alloca memoria in blocchi di byte. Quindi se lo fai malloc(1000) ottieni 1000 byte. malloc non ti interessa se hai assegnato quei 1000 byte per contenere una stringa o qualsiasi altro tipo di dati.

Poiché le stringhe in C sono costituite da un byte per carattere e idealmente devono essere terminate con null, è necessario assicurarsi di avere memoria sufficiente per trattenerlo. Quindi la risposta è: Sì, è necessario allocare 1001 byte se si desidera contenere una stringa di 1000 caratteri più un terminatore null.

Suggerimento avanzato: tenere presente che, a seconda di come lo si utilizza, potrebbe essere necessario terminare con il null una stringa.

Se per esempio conosce la lunghezza esatta della stringa è possibile specificare che quando lo si utilizza con printf

printf("%*s", length, string); 

stamperà esattamente length caratteri dal buffer puntato string.