4

itoa() 函数返回 void 并将结果存储在传递给它的 char[] 数组中,而不是返回 char[] 有什么原因吗?

4

3 回答 3

10

原因是函数期望调用者分配和提供缓冲区。这在 C 中是非常标准的。如果函数返回一个新缓冲区,调用者将不得不处理释放它,它会强制动态分配缓冲区。通过要求调用者提供缓冲区,该函数允许使用自动存储分配缓冲区,或动态分配。

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

于 2013-10-09T22:10:33.407 回答
3

AC 函数不能返回数组。

C 函数可以通过多种方式等效于返回一个数组;他们都不漂亮。

  1. 调用者可以传递一个指向数组第一个元素的指针,以及数组有多大的指示。然后调用者可以填写指向的数组。这需要调用者确定需要多少空间。
  2. 该函数可以定义一个static数组并返回一个指向其第一个元素的指针。这需要在编译时固定数组的大小。这也意味着连续调用将破坏数组。
  3. 该函数可以使用 分配一个数组malloc(),并返回一个指向其第一个元素的指针。这是最灵活的方法,但调用者随后负责调用free()以释放缓冲区,并且还必须准备好处理分配失败。

显然,该功能的设计者itoa()选择了选项 1,在这种情况下,这可能是最不坏的选择。

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

于 2013-10-10T00:47:54.937 回答
2

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

于 2013-10-09T22:13:29.907 回答