2016-05-11 5 views
3

мне интересно, если это безопасно/санкционировано использование:Можно ли повторно использовать один и тот же буфер для последующих вызовов 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 

Можно ли использовать буфер, как это?

+0

Что вы испытали при этом? Я не могу обнаружить UB. –

+3

Да, вы можете (memset не обязательно) –

ответ

5

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

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 
2

Да вы можете. Нет необходимости в memset(), itoa() будет перезаписана.

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

1

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

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

+1

Спасибо за этот отзыв. В итоге я просто использовал 'to_string'. – Enigma

+0

если это помогло, не забудьте принять ответ, пожалуйста. Спасибо – Vtik

+0

Было полезно, хотя это был не прямой ответ на вопрос технически. – Enigma

2

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

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