我正在尝试将结构传递给驻留在单独文件中的函数。将结构作为参数传递时,会引发错误。
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
)中使用该函数,则不会引发任何错误,并且可以正常工作。但是,当将函数保存在两个不同的文件中时,会出现这些错误。
如果有人可以帮助我度过难关,我将不胜感激。预先感谢。
答案 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%是正确的:这是非常危险的做法,所以我更改了它。