const byte SHORT_BUF_LEN = 3;
char tooShortBuf[SHORT_BUF_LEN];
const byte BUF2_LEN = 5;
char buf2[BUF2_LEN];
void fillBuf(char* buffer, byte buflen, char fillChar) {
for (byte i = 0; i < buflen; i++) {
buffer[i] = fillChar;
}
}
void hexdumpString(char* buffer, byte buflen) {
for (byte i = 0; i < buflen; i++) {
Serial.print(i);
Serial.print(": ");
Serial.println(buffer[i], HEX);
}
}
void setup() {
Serial.begin(115200);
fillBuf(buf2, BUF2_LEN, '#');
Serial.println("buf2 before:");
Serial.println(buf2);
hexdumpString(buf2, BUF2_LEN);
sprintf(tooShortBuf, "%d", 1000); // <<<<===== (A)
Serial.println("tooShortBuf after:");
hexdumpString(tooShortBuf, SHORT_BUF_LEN);
Serial.println("buf2 after:");
Serial.println(buf2);
hexdumpString(buf2, BUF2_LEN);
}
void loop() {
}
Risultato:
buf2 before:
#####
0: 23
1: 23
2: 23
3: 23
4: 23
tooShortBuf after:
0: 31
1: 30
2: 30
buf2 after:
0
0: 30
1: 0
2: 23
3: 23
4: 23
I due buffer sono dichiarati di seguito, quindi le loro locazioni di memoria sono adiacenti. Dopo l'ultimo byte allocato per tooShortBuf si trova immediatamente il primo byte allocato per buf2.
La linea contrassegnata con (A) scrive i caratteri '1', '0', '0' .'0', 0x00 a partire dal primo byte allocato per tooShortBuf, ma poiché tale stringa è stata dichiarata di soli 3 byte, gli ultimi due finiscono in realtà "dentro" buf2.
Lo script evidenzia questa "invasione di campo" grazi all'inizializzazione di buf2 con caratteri tutti uguali. Dopo la sprintf su buf2, i primi due sono cambiati.