3

我想知道这是否是安全/认可的用法:

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

4 回答 4

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 
于 2016-05-11T21:05:54.970 回答
2

是的你可以。不需要memset()itoa()会覆盖。

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

于 2016-05-11T21:06:02.217 回答
2

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

另请注意,10characters 不够长itoa,表示 4 个字节 int 的字符串可以长达 11 个字符 +\0终止符,总共 12 个字节。

于 2016-05-11T21:06:44.520 回答
1

最佳实践:根本不要使用它,此函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但某些编译器支持。

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

于 2016-05-11T21:06:44.137 回答