为什么itoa()修改传递的char []而不是返回char []?

时间:2013-10-09 22:07:36

标签: c++ c

有没有理由说itoa()函数返回void并将结果存储在传递给它的char []数组中,而不是返回char []?

3 个答案:

答案 0 :(得分:10)

原因是函数期望调用者分配和提供缓冲区。这在C中是非常标准的。如果函数返回一个新缓冲区,则调用者必须负责释放它,并且它将强制缓冲区被动态分配。通过要求调用者提供缓冲区,该函数允许缓冲区分配自动存储或动态分配。

事实上,我熟悉的itoa版本确实会返回调用者提供的缓冲区,而不是返回void

答案 1 :(得分:3)

C函数无法返回数组。

C函数有几种方法可以完成相同的返回数组;他们都不漂亮。

  1. 调用者可以将指针传递给数组的第一个元素,同时指示数组的大小。然后调用者可以填写指向的数组。这需要调用者确定需要多少空间。
  2. 该函数可以定义static数组并返回指向其第一个元素的指针。这要求在编译时修复数组的大小。这也意味着连续的调用会破坏数组。
  3. 该函数可以使用malloc()分配数组,并返回指向其第一个元素的指针。这是最灵活的方法,但调用者负责调用free()来释放缓冲区,并且还必须准备好处理分配失败。
  4. 显然itoa()函数的设计者选择了选项1,在这种情况下可能是最不好的选择。

    此外,ISO C标准或POSIX没有定义itoa()函数。显然某些 C运行时库将其定义为扩展,但在我尝试过的几个系统(Solaris和一些Linux版本)上它并不存在。如果您关心可移植性,我建议您找一种将整数转换为字符串的方法,可能是sprintfsnprintf

答案 2 :(得分:2)

根据this referenceitoa会返回第二个输入参数,而不是void。根据C标准,不需要修改输入字符串的函数将期望const char *。请注意,itoa不是ANSI-C的一部分(尽管我不知道单个编译器不支持它)。