Мне интересно, если это безопасное / санкционированное использование:
char pBuf[10];
itoa(iInt, pBuf, 10);
// pBuf value gets copied elsewhere
//memset(pBuf, 0, sizeof(pBuf)); // Is this necessary?
itoa(iInt2, pBuf, 10);
// pBuf value gets copied elsewhere
Могу ли я использовать буфер как это?
Да, это безопасно.
itoa
просто перезапишет память и вставит нулевой терминатор в конце. Именно этот нулевой терминатор делает его безопасным (если, конечно, ваш массив достаточно большой)
Учтите следующее:
int iInt = 12345;
char pBuf[10];
itoa(iInt, pBuf, 10);
С этой точки зрения, pBuf
будет выглядеть примерно так в памяти:
+---+---+---+---+---+----+-----------------------------+
| 1 | 2 | 3 | 4 | 5 | \0 | ... unintialised memory ... |
+---+---+---+---+---+----+-----------------------------+
Тогда вы снова используете pBuf
:
int iInt2 = 5;
itoa(iInt2, pBuf, 10);
Сейчас pBuf
будет выглядеть как-то так в памяти:
+---+----+---+---+---+----+-----------------------------+
| 5 | \0 | 3 | 4 | 5 | \0 | ... unintialised memory ... |
+---+----+---+---+---+----+-----------------------------+
^
|
+---- note the null terminator
Да, ты можешь. Не нужно memset()
, itoa()
перезапишу.
Также убедитесь, что ваш буфер достаточно велик, чтобы соответствовать значению.
Да, вы можете позвонить itoa
дважды используя один и тот же буфер. Memset тоже не нужен, т.к. itoa
не делает никаких предположений о том, что буфер пуст.
Также обратите внимание, что 10
персонажи не достаточно долго для itoa
строка, представляющая 4 байта int, может быть длиной до 11 символов + \0
терминатор, всего 12 байт.
Лучшая практика: Не используйте его вообще, эта функция не определена в ANSI-C и не является частью C ++, но поддерживается некоторыми компиляторами.
использование std::to_string
вместо. (Следует иметь в виду, что std :: to_string может привести к неожиданным результатам при использовании с типами с плавающей запятой, а возвращаемые значения могут существенно отличаться от того, что выводит std :: cout)