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

ben*_*r07 1 c struct function

我一直在尝试使用 C 语言中的结构,并尝试与学生一起创建一个简单的结构,其中创建了一个结构,然后我们将一些数据放入该结构中,依此类推,这就是代码。目标是在内部struct Estudante有一个指向该函数的函数指针calcularMedia,但我想向该函数传递一个相同结构类型的参数。

\n
#include <string.h>\n#include <stdio.h>\n\ntypedef struct {\n    char nome[20];\n    char turma[10];\n    int idade;\n    int notas[10];\n    int media;\n    int (*calcularMedia)(Estudante estudante);\n} Estudante;\n\nint calcularMedia(Estudante estudante) {\n    int media = 0;\n    for (int i = 0; i < sizeof(estudante.notas); i++)\n        media += estudante.notas[i];\n    return media;\n}\n\nint main() {\n    Estudante estudante1;\n\n    strcpy(estudante1.nome, "Bernardo");\n    strcpy(estudante1.turma, "10\xc2\xbaF");\n    estudante1.idade = 15;\n    for (int i = 0; i < 10; i++)\n        estudante1.notas[i] = 10;\n\n    printf("A media do %s \xc3\xa9 %d\\n", estudante1.nome,\n           estudante1.calcularMedia(estudante1));\n    return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我试图在结构内部传递结构有一个参数

\n

Som*_*ude 6

类型别名Estudante直到结构本身被定义之后才创建,因此它不能在结构本身内部使用。

但有一个简单的方法可以解决这个问题:使用结构标记名称(例如struct Estudante)并将其用作参数类型:

typedef struct Estudante {
    // Other members...
    int (*calcularMedia)(struct Estudante estudante);
} Estudante;
Run Code Online (Sandbox Code Playgroud)

请注意,结构标记和类型别名使用相同的名称是完全可以的,因为结构标记名称位于单独的命名空间中。

如果您确实想使用类型别名,那么您需要使用结构的前向声明和标签名称来定义别名:

typedef struct Estudante Estudante;
struct Estudante {
    // Other members...
    int (*calcularMedia)(Estudante estudante);
};
Run Code Online (Sandbox Code Playgroud)

另一方面,我建议您将指向结构的指针传递给函数,以避免创建结构的副本。

如果函数不应该修改结构,则传递指向常量对象的指针:

typedef struct Estudante Estudante;
struct Estudante {
    // Other members...
    int (*calcularMedia)(const Estudante *estudante);
};
Run Code Online (Sandbox Code Playgroud)

正如评论中提到的,您需要先分配给结构内的函数指针,然后才能使用它:

estudante1.calcularMedia = calcularMedia;
Run Code Online (Sandbox Code Playgroud)

否则,您将使用未初始化的指针,并且您将出现未定义的行为

哦,还有循环

for(int i=0; i<sizeof(estudante.notas); i++)
Run Code Online (Sandbox Code Playgroud)

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

for(size_t i = 0; i < sizeof(estudante.notas) / sizeof(estudante.notas[0]); i++)
Run Code Online (Sandbox Code Playgroud)