使用itoa()

时间:2017-07-06 09:48:49

标签: c++

我有这段代码,

char a[0];
cout << "What is a? " << a << endl;
char *word = itoa(123,a,10);
string yr = string(word);

但我无法理解数组a [0]。我试图改变它的值,看看是否有任何变化,但它似乎没有任何差异。

例如,即使将[0]更改为[1]或任何其他整数,输出仍然没有区别

char a[1];
cout << "What is a? " << a << endl;
char *word = itoa(123,a,10);
string yr = string(word);

这里的目的是什么?

2 个答案:

答案 0 :(得分:3)

itoa function is non-standard以来,这是对热门签名itoa(int, char*, int)的讨论。

第二个参数表示一个缓冲区,表示该值的以null结尾的字符串将复制到该缓冲区中。它必须为整个字符串提供足够的空间:在您的情况下,这是"123",它需要四个字符。您的代码将a[]作为缓冲区传递,但a[]的大小不足以容纳整个"123"字符串。因此,呼叫会导致undefined behavior

您需要使a足够大以适应目标字符串。传递大小为12的缓冲区足以容纳itoa在32位系统上生成的最长十进制数(即-2147483648)。在声明中将char a[0]替换为char a[12]

答案 1 :(得分:1)

  

这里的目的是什么?

零长度数组是一个没有元素的数组。

您无法[合法]打印或修改其内容,因为它没有任何内容。

There are arcane reasons to want to use one,但一般来说,它对你没有任何意义。它甚至不被标准所允许(尽管编译器倾向于出于那些神秘的原因支持它)。

  

即使将[0]更改为[1]或任何其他整数,输出仍然无差异

好吧,如果你有一个包含 n 元素的数组,并且你写的不仅仅是 n 元素&#39;有价值的数据,这是一个&#34;缓冲区溢出&#34;并且有未定义的行为。当你覆盖别人的记忆,或者你的程序可能崩溃,或者你的狗突然变成僵尸并活着吃掉你时,它似乎可以起作用。最好避免使用。