[英]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.