char a[0] 使用 itoa() 将整数转换为字符串的目的

Purpose of char a[0] in converting integer to string using itoa()

本文关键字:整数 转换 字符串 itoa 使用 char      更新时间:2023-10-16

我有这个代码,

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

但是我很难理解数组 a[0]。我试图改变它的值,看看是否有任何变化,但它似乎根本没有区别。

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

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

它的目的是什么?

由于itoa函数是非标准的,因此这是对流行签名itoa(int, char*, int)的讨论。

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

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

它的目的是什么?

零长度数组是其中没有元素的数组。

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

想要使用一个有晦涩的理由,但一般来说,它对你来说没有任何意义。它甚至不是标准允许的(尽管编译器出于这些神秘的原因倾向于支持它)。

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

好吧,如果你有一个包含 n元素的数组,并且你向它写入了超过 n 个元素的数据,那就是"缓冲区溢出"并且具有未定义的行为。当你覆盖别人的记忆时,它似乎可以工作,或者你的程序可能会崩溃,或者你的狗可能会突然变成僵尸并活活吃掉你。最好避免使用TBH。