如何在C语言中通过函数返回多个值?

7
在面试中有人问我如何从函数中返回多个值。我回答说,在C语言中,我们可以使用指针(通过引用调用)来实现这一点。然后他告诉我他想要其他的返回多个值的方法。我说我们可以返回结构体对象,但他似乎也不太满意。
我想知道从函数中返回多个值的其他方法。我已经看到这些问题在Stack Overflow上被提出,但没有找到任何与C语言特定相关的内容。

除非面试官需要数组(但是这种情况下只能返回相同类型的值),否则结构体和指针是返回多个值的唯一方法。 - Some programmer dude
仅仅因为面试官对于你返回一个结构体(内部包含多个值)的答案不感到满意,并不意味着这不是一个好答案。是的,还有其他方法,但对于C语言来说,返回一个结构体是一个很好的答案。如果你能够“返回”一个数组那就更好了,但在C语言中,你最好只能返回一个指针,而在C++中,你可以返回std::vector - Ray Toal
似乎并没有留下深刻印象...只是没有留下深刻印象,或者他告诉你你完全错了,没有回答他的问题? - Bart
我所说的“似乎并不感到印象深刻”,是指他一直在说他想要一种不在教科书上的方法。 - Amit Singh Tomar
3
「我想要一种不在教科书中的方法。」听起来像是对我发出了警告。 - caf
他可能在挑剔你把“指针调用”标记为“引用调用”:] - moooeeeep
5个回答

27

这个棘手的问题在于,面试官心中可能有某种特别满意的解决方案,并且他们很可能会根据你是否和他们一样聪明地想到相同的巧妙方法来评分。

你可以像你所做的那样列举几种方式,但仍然未必能想到他们的秘密技巧。而如果你知道了他们的秘密技巧,你可能并不会对它感到印象深刻。

因此,在这些情况下,把它从面试变成谈话是很重要的。一旦你发现自己没有朝着他们的自负前进,你就可以避免走向令人畏惧的“我不知道”、“我放弃了”,而是尝试“你有没有什么聪明的解决方案?在Xyz公司内部是否有配方?”等。

任何看到他们显然自我感觉良好的解决方案的线索,你都可以回到稳固的地面,在那里你可以谈论它,并问他们是否考虑了各种想到的因素,基本上是面试他们。

每个人都喜欢一个好的倾听者,让他们谈论他们的技巧是一个让他们对你印象深刻的好方法!;)


优秀的回答。永远要意识到技术面试不仅仅是关于技术话题。 - wallyk
2
在面试中,提出问题以澄清事情非常重要,将抽象和模糊的问题/任务转化为具体可回答/可执行的问题。同样,您可能会发现自己面临过于严格的限制,在那时思考并询问是否可以放宽限制,也许以其他代价为代价是一件好事。最糟糕的是做出错误的假设,由于这个原因无法给出好的或任何答案。如果面试官拒绝提供详细信息,您可以列举可能性并独立解决它们。这将展示您的思维能力。 - Alexey Frunze

1

有几种方法:

  1. 使用return语句返回值(您已经知道了)
  2. 通过引用返回。
  3. 通过堆返回值。
  4. 通过全局变量返回值。

但是,使用返回语句如何返回多个值呢? - Amit Singh Tomar
@AmitSinghTomar:面试官可能是指一种通用的“返回”方式,因为在C语言中,您只能使用return直接返回一个值。 - Alexey Frunze

1

这取决于你如何定义 。如果对于你而言,一个值是一个信息片段,更多的值可以是一组值的结构体。更多的值也可以通过指针或数组传递,甚至是包含一系列(非零字母数字)char*。如果你把一个值看作是一小段信息,那么单个返回的uint32_t就可以容纳32个。你甚至可以混合使用信号、套接字、管道或文件。

但是由于你不知道用例和需求对解决方案所施加的限制,想要提出正确的解决方案确实是一项相当困难的任务(虽然你确实提出了一些适当的解决方案...)。


0

返回结构体指针是合适的答案。(显然,程序的目标可以决定最好的做法)。面试官可能希望你说“我不知道”,这将显示出你在该领域缺乏信心。我认为你提供了很好的解决方案,虽然不是他所想要的。你可以问他一个典型的场景,他想要返回多个值,然后讨论如何使用结构体指针作为合理的替代方案。


0

返回一个指向结构的指针,或将几个小的数据类型打包成一个大的数据类型,或使用全局变量。
第一种方法可能是最清晰的方法,其他两种方法在某些情况下可能有用。

如果我们传递参数的地址而不是真实值。
那么每当我们引用这些参数时,都要使用该地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接