【问题标题】:Pass value to typedef struct on C将值传递给 C 上的 typedef 结构
【发布时间】:2018-04-04 20:04:59
【问题描述】:

这是我当前代码的布局,

test.h

typedef struct{
        int aa;
        int bb;
        int cc;
} ABC;
extern ABC XYZ;  

void passValue(ABC DEF,int a, int b, int c);
void doSomething();

test.c

ABC XYZ;

void passValue(ABC DEF,int a, int b, int c){
  DEF.aa = a;
  DEF.bb = b;
  DEF.cc = c;
}

void doSomething(){
  ...
  ...
  passValue(XYZ,10,20,30);
}  

但当我在主程序上调用doSomething() 时,该值仍为0(未更改)。我试着像对待@R Sahu 回答 this question 一样对待他们,

test.h

typedef struct{
        int aa;
        int bb;
        int cc;
} ABC;
extern ABC XYZ;  

void passValue(ABC * DEF,int a, int b, int c);
void doSomething();

test.c

ABC XYZ;

void passValue(ABC * DEF,int a, int b, int c){
  *DEF.aa = a;  //error
  *DEF.bb = b;  //error
  *DEF.cc = c;  //error
}

void doSomething(){
  ...
  ...
  passValue(&XYZ,10,20,30);
}


ERROR : expression must have struct or union type

【问题讨论】:

  • 你能添加给出ERROR : expression must have struct or union type错误的代码吗?
  • This question and its answers 应该可以帮助您入门。

标签: c struct operators parameter-passing


【解决方案1】:

一元运算符的优先级低于后缀运算符。所以像这样的表达

 *DEF.aa = a;  //error

等价于

*( DEF.aa ) = a;

所以你首先需要应用一元运算符*,然后才应用后缀运算符

( *DEF ).aa = a;
( *DEF ).bb = b;
( *DEF ).cc = c;

或者你可以只使用后缀运算符->

DEF->aa = a;
DEF->bb = b;
DEF->cc = c;

对于第一个函数定义,函数参数是它的局部变量。参数由参数值的副本初始化。因此,在函数中,更改的是副本。原来的论点没有改变。如果要在函数中使用指向它们的指针来更改参数,则需要通过引用传递参数。

【讨论】:

    【解决方案2】:

    *DEF.foo 解析为 *(DEF.foo),而不是 (*DEF).foo。这就是DEF->foo 形式存在的原因; a->b->c->d 的版本只使用 *. 会很糟糕。

    【讨论】:

    • 感谢您的回答,我只是按照您的建议尝试了,但它也会产生编译错误,““*”的操作数必须是指针”
    【解决方案3】:

    how to change value of variable passed as argument? 中的解决方案仅有效,因为字符串常量的特殊属性。它们在函数退出后保持存在,详见"life-time" of string literal in C

    每次将参数传递给函数时,都会创建该参数的副本。然后,您的所有更改都将应用于该副本,该副本在您的函数结束后被丢弃。

    您需要将您希望更改的对象的地址传递给您的函数,然后遵循该地址以便将您的更改应用于结构的原始实例:

    测试.h

    typedef struct{
            int aa;
            int bb;
            int cc;
    } ABC;
    extern ABC XYZ;
    
    
    
    void passValue(ABC *DEF,int a, int b, int c);
    void doSomething();
    

    test.c

    ABC XYZ;
    
    void passValue(ABC *DEF,int a, int b, int c){
      DEF->aa = a;
      DEF->bb = b;
      DEF->cc = c;
    }
    
    void doSomething(){
      ...
      ...
      passValue(&XYZ,10,20,30);
    }  
    

    如果您想了解这一点,您应该阅读更多关于指针的内容: How do pointer to pointers work in C?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多