C 从结构返回值

C 从结构返回值,c,C,在fooV调用中,将创建局部变量值。。。 因此,不会更新调用方中的任何数据 但是如果我想从fooV返回值呢?我应该向fooV添加什么?谢谢如果您只想拥有一个返回“构造的”值结构的fooV函数,您可以按如下方式重写fooV: typedef struct Value{ int id; char type; char a; } Value; void fooV(Value v){ v.id = 10; v.type = 'L'; v.a = 'R';

在fooV调用中,将创建局部变量值。。。 因此,不会更新调用方中的任何数据
但是如果我想从fooV返回值呢?我应该向fooV添加什么?谢谢

如果您只想拥有一个返回“构造的”
结构的
fooV
函数,您可以按如下方式重写
fooV

typedef struct Value{
    int id;
    char type;
    char a;
} Value;

void fooV(Value v){
    v.id = 10;
    v.type = 'L';
    v.a = 'R';
}

int main(void){
    Value v;
    Pointer p;
    int id = 5;
    char type = 't';
    char a = 'a';

    printf("id: %d, type: %c, a: %c \n",id,type,a);

    v.a = a;
    v.id = id;
    v.type = type;
    fooV(v);
    printf("id: %d, type: %c, a: %c \n",id,type,a);

}
你可以这样调用这个函数:

Value fooV() {
    Value v;
    v.id = 10;
    v.type = 'L';
    v.a = 'R';
    return v;
}
否则,如果您需要修改已有的
结构的函数,则有两个选项:您需要更改
fooV的返回类型:

Value v = fooV();
在这种情况下,您可以这样称呼它:

Value fooV(Value v){
    v.id = 10;
    v.type = 'L';
    v.a = 'R';
    return v;
}
void fooV(Value* v){
    v->id = 10;
    v->type = 'L';
    v->a = 'R';
}
或者将fooV更改为接受指向
值的指针

v = fooV(v);
在这种情况下,您可以这样称呼它:

Value fooV(Value v){
    v.id = 10;
    v.type = 'L';
    v.a = 'R';
    return v;
}
void fooV(Value* v){
    v->id = 10;
    v->type = 'L';
    v->a = 'R';
}
您需要通过引用传递v,这是使用C中的指针完成的:

fooV(&v);
或使用->速记操作符:

void fooV(Value* v)
{
    (*v).id = 10;
    (*v).type = 'L';
    (*v).a = 'R';
}
别忘了传递v的地址:

void fooV(Value* v)
{
    v->id = 10;
    v->type = 'L';
    v->a = 'R';
}

并将第二个printf更改为使用v的值,而不是变量id、type、a

fooV(&v);

或者,您可以从
fooV()
值fooV(值v)返回
结构虽然它可能效率较低。我让它工作了!!!!但是你能解释一下(*v).id=10;和*(v)。id=10;出于某种原因,我认为它们是相同的…@metashockwave:运算符“.”的优先级高于运算符“”,因此“*(v.id”和“*v.id”都将被解释为“*(v.id)”。要获得预期的含义,即首先使用“”跟随指针,然后在结构中获取“id”字段,您需要写入“(*v).id”或“v->id”。注意:与C中的所有其他内容一样,结构也是通过值传递的。结构的值可能非常大(就结构的大小而言),因此向结构传递指针是一个好习惯。您的第一个示例不会在堆栈上创建值v吗?这可能会有一些非常严重的副作用…@Robert:是的,
v
存在于堆栈中。不过,我不明白这有什么关系,因为
v
只有在函数结束时才存在,而且函数中没有指向
v
的指针或引用泄漏,因此一旦函数返回,就无法访问它。是的,我的错。我最近写了太多Java:)