我可以为后续的 itoa() 调用重用相同的缓冲区吗?
Can I reuse the same buffer for subsequent itoa() calls?
我想知道这是否是 safe/sanctioned 用法:
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 | [=11=] | ... unintialised memory ... |
+---+---+---+---+---+----+-----------------------------+
那你再用pBuf
:
int iInt2 = 5;
itoa(iInt2, pBuf, 10);
现在 pBuf
在记忆中看起来像这样:
+---+----+---+---+---+----+-----------------------------+
| 5 | [=13=] | 3 | 4 | 5 | [=13=] | ... unintialised memory ... |
+---+----+---+---+---+----+-----------------------------+
^
|
+---- note the null terminator
是的,你可以。不用memset()
,itoa()
会覆盖。
还要确保您的缓冲区足够大以容纳该值。
最佳实践:根本不要使用它,此函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但某些编译器支持。
改用std::to_string
。 (请记住,std::to_string 在与浮点类型一起使用时可能会产生意外结果,并且 return 值可能与 std::cout 打印的值有很大不同)
是的,您可以使用同一个缓冲区调用 itoa
两次。 Memset 也不是必需的,因为 itoa
不假设缓冲区为空。
另请注意10
个字符对于itoa
来说不够长,表示一个4字节int的字符串可以长达11个字符+[=14=]
个终止符,共12个字节.
我想知道这是否是 safe/sanctioned 用法:
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 | [=11=] | ... unintialised memory ... |
+---+---+---+---+---+----+-----------------------------+
那你再用pBuf
:
int iInt2 = 5;
itoa(iInt2, pBuf, 10);
现在 pBuf
在记忆中看起来像这样:
+---+----+---+---+---+----+-----------------------------+
| 5 | [=13=] | 3 | 4 | 5 | [=13=] | ... unintialised memory ... |
+---+----+---+---+---+----+-----------------------------+
^
|
+---- note the null terminator
是的,你可以。不用memset()
,itoa()
会覆盖。
还要确保您的缓冲区足够大以容纳该值。
最佳实践:根本不要使用它,此函数未在 ANSI-C 中定义,也不是 C++ 的一部分,但某些编译器支持。
改用std::to_string
。 (请记住,std::to_string 在与浮点类型一起使用时可能会产生意外结果,并且 return 值可能与 std::cout 打印的值有很大不同)
是的,您可以使用同一个缓冲区调用 itoa
两次。 Memset 也不是必需的,因为 itoa
不假设缓冲区为空。
另请注意10
个字符对于itoa
来说不够长,表示一个4字节int的字符串可以长达11个字符+[=14=]
个终止符,共12个字节.