有没有理由说itoa()函数返回void并将结果存储在传递给它的char []数组中,而不是返回char []?
答案 0 :(得分:10)
原因是函数期望调用者分配和提供缓冲区。这在C中是非常标准的。如果函数返回一个新缓冲区,则调用者必须负责释放它,并且它将强制缓冲区被动态分配。通过要求调用者提供缓冲区,该函数允许缓冲区分配自动存储或动态分配。
事实上,我熟悉的itoa
版本确实会返回调用者提供的缓冲区,而不是返回void
。
答案 1 :(得分:3)
C函数无法返回数组。
C函数有几种方法可以完成相同的返回数组;他们都不漂亮。
static
数组并返回指向其第一个元素的指针。这要求在编译时修复数组的大小。这也意味着连续的调用会破坏数组。malloc()
分配数组,并返回指向其第一个元素的指针。这是最灵活的方法,但调用者负责调用free()
来释放缓冲区,并且还必须准备好处理分配失败。显然itoa()
函数的设计者选择了选项1,在这种情况下可能是最不好的选择。
此外,ISO C标准或POSIX没有定义itoa()
函数。显然某些 C运行时库将其定义为扩展,但在我尝试过的几个系统(Solaris和一些Linux版本)上它并不存在。如果您关心可移植性,我建议您找一种将整数转换为字符串的方法,可能是sprintf
或snprintf
。
答案 2 :(得分:2)
根据this reference,itoa
会返回第二个输入参数,而不是void
。根据C标准,不需要修改输入字符串的函数将期望const char *
。请注意,itoa
不是ANSI-C的一部分(尽管我不知道单个编译器不支持它)。