Могу ли я повторно использовать этот же буфер для последующих вызовов itoa ()?

Мне интересно, если это безопасное / санкционированное использование:

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

Могу ли я использовать буфер как это?

3

Решение

Да, это безопасно.

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
5

Другие решения

Да, ты можешь. Не нужно memset(), itoa() перезапишу.

Также убедитесь, что ваш буфер достаточно велик, чтобы соответствовать значению.

2

Да, вы можете позвонить itoa дважды используя один и тот же буфер. Memset тоже не нужен, т.к. itoa не делает никаких предположений о том, что буфер пуст.

Также обратите внимание, что 10 персонажи не достаточно долго для itoaстрока, представляющая 4 байта int, может быть длиной до 11 символов + \0 терминатор, всего 12 байт.

2

Лучшая практика: Не используйте его вообще, эта функция не определена в ANSI-C и не является частью C ++, но поддерживается некоторыми компиляторами.

использование std::to_string вместо. (Следует иметь в виду, что std :: to_string может привести к неожиданным результатам при использовании с типами с плавающей запятой, а возвращаемые значения могут существенно отличаться от того, что выводит std :: cout)

1
По вопросам рекламы [email protected]