C将结构类型传递给同一结构内的函数

ubbxdtey  于 2023-03-12  发布在  其他
关注(0)|答案(2)|浏览(120)

我一直在尝试用C语言写结构体,并尝试和学生们一起写一个简单的结构体,在这个结构体中,我们放入一些数据,以此类推,这是代码,目标是在struct Estudante中,有一个指向函数calcularMedia的函数指针,但我想给那个函数传递一个相同结构类型的参数。

#include <string.h>
#include <stdio.h>

typedef struct {
    char nome[20];
    char turma[10];
    int idade;
    int notas[10];
    int media;
    int (*calcularMedia)(Estudante estudante);
} Estudante;

int calcularMedia(Estudante estudante) {
    int media = 0;
    for (int i = 0; i < sizeof(estudante.notas); i++)
        media += estudante.notas[i];
    return media;
}

int main() {
    Estudante estudante1;

    strcpy(estudante1.nome, "Bernardo");
    strcpy(estudante1.turma, "10ºF");
    estudante1.idade = 15;
    for (int i = 0; i < 10; i++)
        estudante1.notas[i] = 10;

    printf("A media do %s é %d\n", estudante1.nome,
           estudante1.calcularMedia(estudante1));
    return 0;
}

我试图在结构体内部传递结构体,但结构体有参数

jhdbpxl9

jhdbpxl91#

类型别名Estudante直到结构本身定义之后才创建,因此不能在结构本身内部使用。
但有一个简单的方法可以解决它:使用结构标记名(例如struct Estudante)并将其用于参数类型:

typedef struct Estudante {
    // Other members...
    int (*calcularMedia)(struct Estudante estudante);
} Estudante;

请注意,结构标记和类型别名使用相同的名称是非常好的,因为结构标记名称位于单独的名称空间中。
如果你真的想用类型别名来代替,那么你需要使用结构的 forward declaration,带一个标记名来定义别名:

typedef struct Estudante Estudante;
struct Estudante {
    // Other members...
    int (*calcularMedia)(Estudante estudante);
};

另一方面,我建议您向函数传递一个指向结构的 * 指针 *,以避免创建结构的副本。
如果函数不需要修改结构,那么就传递一个指向常量对象的指针:

typedef struct Estudante Estudante;
struct Estudante {
    // Other members...
    int (*calcularMedia)(const Estudante *estudante);
};

正如在注解中提到的,在使用函数指针之前,您需要在结构内部为它赋值:

estudante1.calcularMedia = calcularMedia;

否则,您将使用一个 uninitialized 指针,并且您将具有 undefined behavior
哦,还有循环

for(int i=0; i<sizeof(estudante.notas); i++)

错误。sizeof运算符返回的大小以 * 字节 * 为单位,而不是以元素为单位。要获得元素数,请将总大小除以单个元素的大小:

for(size_t i = 0; i < sizeof(estudante.notas) / sizeof(estudante.notas[0]); i++)
z4iuyo4d

z4iuyo4d2#

使用带标记的结构:

typedef struct Estudante{
    char nome[20];
    char turma[10];
    int idade;
    int notas[10];
    int media;
    int (*calcularMedia)(struct Estudante estudante);
} Estudante;

如果你想写:

int (*calcularMedia)(Estudante estudante);

相反(不使用struct关键字),然后使用带标记的struct,您还可以在struct类型完成之前使用typedef:

typedef struct Estudante Estudante;
struct Estudante {
//...
};

相关问题