我可以为后续的itoa()调用重用相同的缓冲区吗?

时间:2016-05-11 20:57:49

标签: c++ buffer 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

我可以像这样重用缓冲区吗?

4 个答案:

答案 0 :(得分: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 

答案 1 :(得分:2)

是的,你可以。无需memset()itoa()将覆盖。

还要确保您的缓冲区足够大以适应该值。

答案 2 :(得分:2)

是的,您可以使用相同的缓冲区调用itoa两次。 Memset也没有必要,因为itoa没有假设缓冲区为空。

另请注意,10字符对于itoa来说不够长,表示4字节int的字符串可以长达11个字符+ \0终止符,总计12个字节。< / p>

答案 3 :(得分:1)

最佳实践:完全不使用,此功能未在ANSI-C中定义且不属于C ++,但受某些编译器支持。

请改用std::to_string。 (要记住,当与浮点类型一起使用时,std :: to_string可能会产生意外结果,并且返回值可能与std :: cout打印的内容大不相同)