将结构传递给函数以分配值
Posted
技术标签:
【中文标题】将结构传递给函数以分配值【英文标题】:Passing struct to a function to assign values 【发布时间】:2019-05-09 02:13:51 【问题描述】:我正在尝试将结构传递给驻留在单独文件中的函数。将结构体作为参数传递时,会引发错误。
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
)中使用该函数,它不会抛出任何错误并且工作正常。但是当将函数保存在两个不同的文件中时,它会给我这些错误。
如果有人能帮助我度过难关,将不胜感激。提前致谢。
【问题讨论】:
C 是严格按值传递的。想想影响。 好吧,真正的问题是 什么 是按值传递的。在这方面,C 语言中结构和数组的传递 syntax 如何看起来 是相同的,但编译器对这种语法的理解却完全不同.这就是为什么我称它为“陷阱”。 【参考方案1】:错误:参数 1 (‘devanshu’) 的类型不完整
这意味着结构定义对您在其中使用的文件不可见。除非这是故意的,否则您需要将结构定义放在头文件中,并在每个使用该结构的 .c 文件中包含它。
预期为“struct student”,但参数类型为“struct student *”
你写错了函数。它应该是void func(struct student* devanshu);
,并且在函数内部您应该使用devanshu-> ...
访问成员。否则,您只需将结构的副本传递给函数,然后更改本地副本。
【讨论】:
这是一个很好的解释。感谢您帮助我理解这一点。当谈到 C 和struct
时,我仍然是一个新手,就像 pointers
可能很难使用。感谢您的帮助【参考方案2】:
这些错误是不言自明的。拿这个:
test.c:在函数'main'中:
test.c:23:7: 错误:'func' 的参数 1 的类型不兼容
函数(&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 文件中。这意味着您有一个一致的定义,可以由所有需要它的文件共享。
【讨论】:
我会感谢您的回答,并解释它如何帮助我理解我的缺点,但据我所知,这对于一个崭露头角的开发人员来说是多余的,而不是最佳实践。再次感谢【参考方案3】:好的,这会起作用:(下面的解释)
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() 上给您带来问题。改为仅字符。
这个
void func(struct student devanshu);
没有错,但你掉进了陷阱。 C 中的结构总是按整个结构的值(副本)传递。所以,如果你想让 func() 修改原始结构,你必须明确告诉它:
void func(struct student *devanshu);
然后,在func中,您需要将访问语法更改为使用->操作符而不是'.'
当您在两个文件中都使用 struct student 时,您需要将 struct 的声明移出到头文件中。您可以(就像我在第一次编辑时所做的那样)也可以重复声明,因为我很懒,但是 cmets 是 100% 正确的:这是一种非常危险的做法,所以我改变了它。
【讨论】:
您在每个文件中都有一个struct student
版本 - 如果一个版本发生变化会发生什么?也答案缺乏任何解释
不是(还)我的反对意见,但是:在两个 .c 文件中明确重复 struct student...
是不行的,这是非常非常糟糕的做法。而且只给出没有解释的代码也不是很有帮助。
正在解释解释...不是那么快。
@Jabberwocky 是的,我知道,不知何故,在 *** 网站内编辑(至少在我这边)非常慢,我在按键和获取字符之间经常有 1-2 秒的延迟屏幕上。所以我试着分块做......
感谢@GermanNerd 的时间和精力。我明白了,在为手头的特定问题提供答案时,我们经常忘记使用所涉及的最佳实践,所以我会忽略这一点,并 +1 你的答案以帮助我解决这个问题。再次感谢。以上是关于将结构传递给函数以分配值的主要内容,如果未能解决你的问题,请参考以下文章
Python & Ctypes:将结构作为指针传递给函数以获取数据