C non ha e non ha mai avuto un tipo di stringa nativo. Per convenzione, la lingua utilizza le matrici di char
terminate con un carattere null, ovvero con '\0'
. Le funzioni e le macro nelle librerie standard del linguaggio forniscono il supporto per gli array di caratteri con terminazione nulla, ad esempio strlen itera su un array di char
finché non incontra un carattere '\0'
e strcpy copie dalla stringa di origine finché non incontra uno '\0'
.
L'uso di stringhe con terminazione null in C riflette il fatto che C era destinato ad essere solo un po 'più di alto livello rispetto al linguaggio assembly. Le stringhe a terminazione zero erano già supportate direttamente in quel momento in assembly language for the PDP-10 and PDP-11.
Vale la pena notare che questa proprietà di stringhe C causa alcuni bug di sovraccarico del buffer, inclusi gravi errori di sicurezza. Ad esempio, se si dimentica di terminare con null la stringa di caratteri passata come argomento sorgente a strcpy
, la funzione manterrà copia dei byte sequenziali da qualsiasi cosa si trovi in memoria oltre la fine della stringa di origine finché non si verificherà un 0
, potenzialmente sovrascrivendo qualsiasi informazione preziosa segue la posizione della stringa di destinazione in memoria.
Nell'esempio di codice, la stringa letterale "Hello, world!" sarà compilato in un array lungo 14 byte di char
. I primi 13 byte contengono le lettere, la virgola, lo spazio e il punto esclamativo e il byte finale conterrà il carattere con terminatore nullo '\0'
, automaticamente aggiunto per te dal compilatore. Se si dovesse accedere all'ultimo elemento dell'array, lo si troverà uguale a 0
. Es .:
const char foo[] = "Hello, world!";
assert(foo[12] == '!');
assert(foo[13] == '\0');
Tuttavia, nel tuo esempio, message
è lungo solo 10 bytes. strcpy
scrive tutti i 14 byte, incluso il null-terminator, in memoria a partire dall'indirizzo message
. I primi 10 byte verranno scritti nella memoria allocata nello stack per message
ei restanti quattro byte verranno semplicemente scritti alla fine dello stack. La conseguenza di scrivere quei quattro byte in più nello stack è difficile da prevedere in questo caso (in questo semplice esempio, potrebbe non ferire una cosa), ma nel codice reale porta di solito a dati corrotti o errori di violazione di accesso alla memoria.
C non ha stringhe. – sashoalm
è necessario un messaggio di carattere [14]; – acraig5075
Il tuo strcpy traboccherà il tuo array di caratteri. è necessario almeno un array di caratteri di lunghezza 14 (13 caratteri + terminatore nul) – wich