【问题标题】:C - Pass struct by referenceC - 通过引用传递结构
【发布时间】:2017-01-26 22:28:22
【问题描述】:

我试图在 C 中通过引用传递一个结构,以便我可以在函数内修改值。这是我到目前为止的代码,但它会产生一些警告和一个错误。

main.c

#include <stdio.h>
#include "myfunctions.h"
#include "structures.h"

int main(int argc, char const *argv[] {

    struct MyStruct data;

    data.value = 6;

    printf("Before change: %d\n", data.value);

    changeData(data);

    printf("After change: %d\n", data.value);

}

myfunctions.c

#include "structures.h"

void changeData(MyStruct data) {
    data.value = 7;
}

myfunctions.h

#ifndef MyStruct
#define MyStruct

void changeData(MyStruct data);

#endif

结构.h

typedef struct {

    int value;

} MyStruct;

产生的错误

In file included from main.c:2:0:
myfunctions.h:4:1: warning: parameter names (without types) in function declaration
 void changeData(MyStruct data);
 ^
In file included from main.c:3:0:
structures.h:5:1: warning: unnamed struct/union that defines no instances
 } MyStruct;
 ^
main.c: In function ‘main’:
main.c:9:5: error: ‘data’ undeclared (first use in this function)
     data.value = 6;
     ^
main.c:9:5: note: each undeclared identifier is reported only once for each function it appears in

【问题讨论】:

  • void changeData( MyStruct *data)changeData(&amp;data)
  • 如果你想传递一个指向结构的指针,你需要明确地这样做。
  • 确保选中页面右侧的相关。您的标题出现了很多次。
  • 仅供参考……C 中没有引用传递。C 完全是值传递。当您将指针传递给函数时,会在该函数中创建一个本地副本,并取消引用它指向与调用者中的指针相同的内存地址。
  • 开始,这一行:int main(int argc, char const *argv[] { 缺少左括号 ) 在左大括号'{'之前

标签: c struct pass-by-reference


【解决方案1】:

都是因为

#define MyStruct

通过这一行,您已将MyStruct 定义为扩展为空的宏。 IE。您已经有效地删除了以下代码中所有出现的MyStruct,这就是为什么编译器对看到类似

的东西感到如此困惑的原因
typedef struct {

    int value;

} ;

void changeData( data);

要解决此问题,请使用

#ifndef MYFUNCTIONS_H_
#define MYFUNCTIONS_H_

相反。 (这就是我们为宏使用ALL_UPPERCASE 名称的原因:为了避免名称与普通标识符发生意外冲突。)

【讨论】:

    【解决方案2】:

    应用我所有的 cmets 并消除不必要的 'typedef',并将其全部放在一个文件中(注意:提取各种文件没有问题),结果如下:

    #ifndef STRUCTURES_H
    #define STRUCTURES_H
    
    struct MyStruct
    {
        int value;
    };
    #endif // STRUCTURES_H
    
    
    
    #ifndef MYFUNCTIONS_H
    #define MYFUNCTIONS_H
    
    void changeData( struct MyStruct *data);
    
    #endif // MYFUNCTIONS_H
    
    
    
    
    
    #include <stdio.h>
    //#include "myfunctions.h"
    //#include "structures.h"
    
    int main( void )
    {
        struct MyStruct data;
    
        data.value = 6;
    
        printf("Before change: %d\n", data.value);
    
        changeData(&data);
    
        printf("After change: %d\n", data.value);
    } // end function: main
    
    
    
    //#include "structures.h"
    
    void changeData( struct MyStruct *data)
    {
        data->value = 7;
    } // end function: changeData
    

    它可以干净地编译并执行所需的操作

    【讨论】:

      猜你喜欢
      • 2013-05-12
      • 2011-02-02
      • 1970-01-01
      • 2015-11-14
      • 2012-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      相关资源
      最近更新 更多