在 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。所以它只知道有一个结构 typedef
ed 为 mystruct
但它对其内容一无所知,因此也无法确定 ts 大小,所以你不能使用 sizeof()
。出于同样的原因,您无法访问任何结构成员,int *p = mystruct->ptr3
;或者 mystruct->ptr1 = &mydouble;
也不会编译。
尽管如此,这种设计还是很常见的。假设您希望以类似 OO 的方式封装对 mystruct
的每次访问。然后你有一个来源,比如 mystruct.c 你实际定义结构的地方(就像你在 myheader.c 中所做的那样)并提供所有必要的 getter 和 setter 函数(包括分配函数).然后在所有其他来源中,您可以以任何您喜欢的方式传递结构指针,但对于其他所有内容,您必须使用指定的函数。
这种方法的优点是将来您可以自由修改结构,而不必重新编译使用它的每个源代码。
我在头文件上声明了一个 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。所以它只知道有一个结构 typedef
ed 为 mystruct
但它对其内容一无所知,因此也无法确定 ts 大小,所以你不能使用 sizeof()
。出于同样的原因,您无法访问任何结构成员,int *p = mystruct->ptr3
;或者 mystruct->ptr1 = &mydouble;
也不会编译。
尽管如此,这种设计还是很常见的。假设您希望以类似 OO 的方式封装对 mystruct
的每次访问。然后你有一个来源,比如 mystruct.c 你实际定义结构的地方(就像你在 myheader.c 中所做的那样)并提供所有必要的 getter 和 setter 函数(包括分配函数).然后在所有其他来源中,您可以以任何您喜欢的方式传递结构指针,但对于其他所有内容,您必须使用指定的函数。
这种方法的优点是将来您可以自由修改结构,而不必重新编译使用它的每个源代码。