将结构传递给函数以分配值

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:将结构作为指针传递给函数以获取数据

C / C ++:将带有成员数组的结构/类按值传递给函数

将结构值分配给此关键字

C:为啥你可以通过值传递(给函数)一个结构,而不是一个数组?

结构体作为函数参数值传递的问题