繁体   English   中英

将struct传递给函数以赋值

[英]Passing struct to a function to assign values

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

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使用该函数,则不会引发任何错误,并且工作正常。 但是,当将函数保存在两个不同的文件中时,会出现这些错误。

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

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

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

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

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

错误是不言自明的。 拿这个:

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文件中。 这意味着您有一个一致的定义,可以由需要它的所有文件共享。

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

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%是正确的:这是非常危险的做法,所以我更改了它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM