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