在 C 头文件中声明的结构 - gcc malloc 错误

Struct declared in C header file - gcc malloc error

我在头文件上声明了一个 typedef 结构,如下所示:

myheader.h

typedef struct mystruct mystruct;

myheader.c

typedef struct mystruct{
    double *ptr1;
    double *ptr2;
    int *ptr3;
    mystruct *ptr4;
    mystruct *ptr5;
}mystruct;

program.c

#include "myheader.h"
int main()
{
mystruct *A = (mystruct *)malloc(sizeof(mystruct));
} 

当我尝试编译时使用:

gcc -o myprogram myprogram.c myheader.c

我收到以下错误:

error: invalid application of ‘sizeof’ to incomplete type ‘mystruct’ {aka ‘struct mystruct’}

    mystruct * A = (mystruct *)malloc(sizeof(mystruct));


是我的代码有问题还是我编译的方式不对?

正如@someprogrammerdude 在他关于 translation units 的评论中已经指出的那样:当编译器编译 main.c 时,它只知道 main.c 和包含的 headers。所以它只知道有一个结构 typedefed 为 mystruct 但它对其内容一无所知,因此也无法确定 ts 大小,所以你不能使用 sizeof()。出于同样的原因,您无法访问任何结构成员,int *p = mystruct->ptr3;或者 mystruct->ptr1 = &mydouble; 也不会编译。

尽管如此,这种设计还是很常见的。假设您希望以类似 OO 的方式封装对 mystruct 的每次访问。然后你有一个来源,比如 mystruct.c 你实际定义结构的地方(就像你在 myheader.c 中所做的那样)并提供所有必要的 getter 和 setter 函数(包括分配函数).然后在所有其他来源中,您可以以任何您喜欢的方式传递结构指针,但对于其他所有内容,您必须使用指定的函数。

这种方法的优点是将来您可以自由修改结构,而不必重新编译使用它的每个源代码。