Функция возвращает указатель на локальный буфер
Функция формирует идентификатор устройства:
char *make_id(int n) {
char buf[16];
snprintf(buf, sizeof(buf), "dev-%d", n);
return buf;
}
Вызывающий код печатает результат: иногда строка выглядит правильно, иногда — мусор, а после добавления любого вызова между make_id и печатью всё ломается стабильно. В чём причина?
- Размер буфера в 16 байт слишком мал, поэтому snprintf обрезает строку и вызывающий код печатает обрезанный мусор
- snprintf не дописывает завершающий нулевой байт, поэтому строку нужно закрывать вручную присваиванием buf[15] = 0
- buf лежит в кадре стека функции; после возврата кадр переиспользуется, и указатель становится висячим
- Ошибки нет: раз функция вернула указатель на массив, компилятор продлевает время жизни этого массива до конца выражения
