segue è un semplice programma C:dati Memorizzazione (stringa) fuori limite in un array allocato dinamicamente
char *p = (char*)calloc(5,sizeof(char));
strcpy(p,"Elephant");
printf("String = %s\n", p);
p[6] = 'D';
printf("String = %s\n", p);
che alloca un array di caratteri su 5 elementi utilizzando calloc() e utilizza strcpy() per copiare una stringa nell'array. Di seguito è riportato l'output:
String = Elephant
String = ElephaDt
Chiaramente, ho chiesto solo e quindi curiosi 5 elementi char sapere perché la memoria Gestione sistema operativo mi ha permesso di memorizzare più elementi fuori dai limiti dello spazio assegnato dinamicamente in p . Se mi è stato assegnato solo uno spazio di 5 caratteri, in che modo strcpy() è stato in grado di memorizzare una stringa ancora più grande "Elephant" che ha una lunghezza superiore a 5 caratteri?
C non ha limiti di controllo, il compilatore non si lamenterà (o lo saprà davvero) se si scrive fuori limite. Ciò comporta un comportamento * non definito *, quindi non farlo. –
@Joachim Pileborg "non si lamenterà ... se scrivi fuori limite" è un comportamento definito. Certamente C non specifica il controllo dei limiti, ma un compilatore può utilizzarlo. La scrittura fuori dai limiti è UB. – chux
"perché la memoria del sistema operativo mgmt mi ha permesso di memorizzare più elementi fuori dai limiti dello spazio allocato dinamicamente in p". -> Cosa ti aspettavi che il codice sarebbe stato richiesto di fare in una situazione come questa? – chux