将struct传递给函数以赋值

时间:2018-12-07 10:11:51

标签: c struct

我正在尝试将结构传递给驻留在单独文件中的函数。将结构作为参数传递时,会引发错误。

Test.c

struct student{
        int rollNumber;
        unsigned char name[20];
        int marks;
};

void func(struct student devanshu);

int main(){

        struct student devanshu;

        func(&devanshu);
        printf("--------------------%d\n", devanshu.rollNumber);
        printf("--------------------%d\n", devanshu.marks);
        printf("--------------------%s\n", devanshu.name);

}

NewTest.c:

void func(struct student devanshu)
{


        devanshu.rollNumber = 1;
        devanshu.marks = 909;
        strcpy(devanshu.name, "abc.xyz");


return;
}

这是我得到的输出:

In file included from test.c:6:0:
newtest.c:10:30: error: parameter 1 (‘devanshu’) has incomplete type
 void func(struct student devanshu)

test.c: In function ‘main’:
test.c:23:7: error: incompatible type for argument 1 of ‘func’
  func(&devanshu);
       ^
In file included from test.c:6:0:
newtest.c:10:6: note: expected ‘struct student’ but argument is of type ‘struct student *’
 void func(struct student devanshu)

newtest.c:10:30: error: parameter 1 (‘devanshu’) has incomplete type
 void func(struct student devanshu)

newtest.c:7:20: error: storage size of ‘devanshu’ isn’t known
 struct student devanshu;

如果我在同一文件(即test.c)中使用该函数,则不会引发任何错误,并且可以正常工作。但是,当将函数保存在两个不同的文件中时,会出现这些错误。

如果有人可以帮助我度过难关,我将不胜感激。预先感谢。

3 个答案:

答案 0 :(得分:3)

  

错误:参数1(devanshu)类型不完整

这意味着结构定义对于您在其中使用的文件不可见。除非故意这样做,否则您需要将结构定义放在头文件中,并使用该结构在每个.c文件中包括该定义。

  

预期为“结构学生”,但参数的类型为“结构学生*”

您编写的功能不正确。它应该是void func(struct student* devanshu);,并且在函数内部您应该使用devanshu-> ...访问成员。否则,您只需将结构的副本传递给函数,然后更改本地副本。

答案 1 :(得分:3)

这些错误很容易解释。拿这个:

  

test.c:在“ main”函数中:

     

test.c:23:7:错误:“ func”的参数1的类型不兼容

     

func(&devanshu);

这意味着您要向func传递某种与您告诉编译器func接受的类型不同的类型。您已声明该函数采用struct student

void func(struct student devanshu);

但是函数调用正在传递指向struct student的指针。

func(&devanshu);

函数调用是正确的,因为您希望函数可以访问要传递的结构而不是副本。因此,您需要将函数更改为采用struct student *

其他错误是因为您没有使用包含文件来存储struct的定义。

创建一个名为“ student.h”(或其他名称)的文件,并将结构的定义移入其中。还有函数的声明。

struct student{
        int rollNumber;
        unsigned char name[20];
        int marks;
};

void func(struct student *);

,并且在您放置的两个C文件的顶部

#include "student.h"

告诉编译器在编译时将文件的内容复制到C文件中。这意味着您有一个一致的定义,可以由需要它的所有文件共享。

答案 2 :(得分:-1)

好的,这将起作用:(下面的解释)

test.h :(新文件!)

struct student{
        int rollNumber;
        char name[20];
        int marks;
};

test.c:

#include <stdio.h>
#include <stdlib.h>
#include "test.h"

void func(struct student *devanshu);

int main(){

        struct student devanshu;

        func(&devanshu);
        printf("--------------------%d\n", devanshu.rollNumber);
        printf("--------------------%d\n", devanshu.marks);
        printf("--------------------%s\n", devanshu.name);

}

NewTest.c:

#include <string.h>
#include "test.h"


void func(struct student *devanshu)
{


    devanshu->rollNumber = 1;
    devanshu->marks = 909;
    strcpy(devanshu->name, "abc.xyz");


    return;
}

unsigned char name[20];

稍后会在strcpy()上给您带来问题。更改为仅char。

void func(struct student devanshu);

没错,但是您陷入了陷阱。 C语言中的结构始终按整个结构的值(副本)传递。因此,如果您希望func()修改原始结构,则必须明确地告诉它:

void func(struct student *devanshu);

然后,在func中,您需要将访问语法更改为使用->运算符,而不是'。'

在两个文件中都使用struct学生时,需要将struct的声明移到头文件中。您可以(就像我在第一次编辑时所做的那样)也重复声明,因为我很懒,但是注释100%是正确的:这是非常危险的做法,所以我更改了它。