【问题标题】:Return value of a function with a non-default type具有非默认类型的函数的返回值
【发布时间】:2012-01-05 15:56:09
【问题描述】:

我有一个函数:

*Foo* create_foo();

其中 Foo 是一个具有许多字段的结构:

typedef struct foo {
    int progr_num;
    char* size;
    char* account;
    int matric_num;
    int codex_grp;
    char* note;
} Foo;

我调用这个函数的具体返回值是多少?

功能:

Foo create_foo() {
    Foo x;
    ...
    ...
    return x
}

我知道返回类型是Foo,但是如果我调用函数并想测试返回值,哪个是正确的值?? (例如,如果函数是 int 类型,则返回 0 或 -1)。

当我调用函数时,返回正确的值是什么??

例如:

int main() {
    Foo foo_check;
    foo_check = create_foo();
    if(!foo_check)
    return ... **???**
}

【问题讨论】:

  • 好吧,根据您的解释,该函数返回一个结构。您需要通过“测试”返回值(即结构)来解释您的确切含义。
  • “(例如,如果一个函数是 int 类型,则返回 0 或 -1)”是什么意思?我认为您对返回类型感到困惑。在int create_int(); 中,返回的 int 是大范围内的任何正整数或负整数或零整数。
  • @Kyrol:Foo create_foo(); 不是函数。它是一个函数定义。您的回报值在函数中定义。也许我不明白你的问题......
  • @AaronMcDaid 我并不感到困惑。我知道,现在看看我以更好的方式编辑问题。

标签: c function return-value return-type


【解决方案1】:

与其在堆栈上来回传递(大)结构体,不如传递一个指针并将堆栈用作状态指示器。

struct foo { /* ... whatever ... */ };
int fxfoo(struct foo *pfoo) { /* ... whatever ... */ return ALLOK?0:1; }
int main(void) {
    struct foo objfoo;
    if (fxfoo(&objfoo)) /* error */;
}

【讨论】:

  • 谢谢!现在我明白了......但我不明白我的问题的-1。好的是一个愚蠢的问题,但我只是想明白!不过谢谢你的回答!
  • 我没有否决你的问题。我也有意见不赞成应该解释:)
  • 完全正确...好的,我理解错误。而不是做一个结构类型的函数,我必须做一个 int 类型的函数并将结构的指针作为参数传递。对? ;)
  • 对。这是通常的做法。
  • 如果一个函数返回一个Foo,它就会返回一个Foo,就这么简单。它从不返回任何额外信息。您似乎想“返回”两条信息。您想返回函数的成功与否,如果成功,您想访问带有答案的Foo。这就是@pmg 所做的。
【解决方案2】:

返回值是结构Foo 的完整实例。如果你想检查它的值,你必须将它分配给某个东西,然后逐个字段地检查。

【讨论】:

    【解决方案3】:
    struct A{
    int x;
    char c;
    }
    
    Foo create_foo(){
    struct A a;
    a.x = 5;
    a.c = 'd';
    
    return a; // <-- This will be your return value.
    }
    

    【讨论】:

    • 这没关系,但现在我更好地编辑了这个问题。我想我一开始就解释得最糟糕。
    【解决方案4】:

    您使用返回值的方式与使用任何返回值的方式相同...

    Foo x = create_foo();
    if(x.field == y) {...};
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-11-25
      • 2022-08-05
      • 1970-01-01
      • 2020-09-01
      • 1970-01-01
      相关资源
      最近更新 更多