首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在C中从一个函数返回多个值?

如何在C中从一个函数返回多个值?
EN

Stack Overflow用户
提问于 2010-04-12 14:03:43
回答 8查看 294.2K关注 0票数 97

如果我有一个生成结果int和结果string的函数,我如何从函数中返回这两个结果?

据我所知,我只能返回一个东西,这是由函数名前面的类型决定的。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2010-04-12 14:05:59

我不知道你的string是什么,但我假设它管理着自己的内存。

您有两种解决方案:

1:返回一个包含所有需要的类型的struct

代码语言:javascript
复制
struct Tuple {
    int a;
    string b;
};

struct Tuple getPair() {
    Tuple r = { 1, getString() };
    return r;
}

void foo() {
    struct Tuple t = getPair();
}

2:使用指针传出值。

代码语言:javascript
复制
void getPair(int* a, string* b) {
    // Check that these are not pointing to NULL
    assert(a);
    assert(b);
    *a = 1;
    *b = getString();
}

void foo() {
    int a, b;
    getPair(&a, &b);
}

您选择使用哪一种语义在很大程度上取决于个人偏好,即您更喜欢哪种语义。

票数 130
EN

Stack Overflow用户

发布于 2010-04-12 14:10:57

Option 1:声明一个带有整数和字符串的结构,并返回一个结构变量。

代码语言:javascript
复制
struct foo {    
 int bar1;
 char bar2[MAX];
};

struct foo fun() {
 struct foo fooObj;
 ...
 return fooObj;
}

Option 2:您可以通过指针传递两个参数中的一个,并通过指针更改实际参数,然后像往常一样返回另一个:

代码语言:javascript
复制
int fun(char **param) {
 int bar;
 ...
 strcpy(*param,"....");
 return bar;
}

代码语言:javascript
复制
 char* fun(int *param) {
 char *str = /* malloc suitably.*/
 ...
 strcpy(str,"....");
 *param = /* some value */
 return str;
}

Option 3:类似于选项2。可以通过指针传递,也可以不从函数返回任何内容:

代码语言:javascript
复制
void fun(char **param1,int *param2) {
 strcpy(*param1,"....");
 *param2 = /* some calculated value */
}
票数 10
EN

Stack Overflow用户

发布于 2010-04-12 14:10:31

由于您的结果类型之一是字符串(并且您使用的是C,而不是C++),因此我建议将指针作为输出参数进行传递。使用:

代码语言:javascript
复制
void foo(int *a, char *s, int size);

然后这样叫它:

代码语言:javascript
复制
int a;
char *s = (char *)malloc(100); /* I never know how much to allocate :) */
foo(&a, s, 100);

一般来说,更喜欢在调用函数中进行分配,而不是在函数本身内部进行分配,这样您就可以尽可能地开放不同的分配策略。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2620146

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档