[英]struct forward declaration in C
我想在我的c模块中隐藏指定的结构,因此结构声明在* .c文件中,并且标头包含typedef。 像这样:
/* member.h */
typedef struct MEMBER_T *member_t;
/* member.c */
#include "member.h"
struct MEMBER_T {
unsigned int member_id;
char name;
};
后来在c文件中我想做一个成员表:
members = calloc(10, sizeof(member_t));
但这是错误的,我知道。 如何使用该解决方案? 我的意思是如何为member_t创建对象?
提前致谢!
您正在分配一个数组。 您仍然需要分配其每个元素。
如果要将结构隐藏在.c文件中,则将其创建封装起来也是一个好主意。 因此,您的struct用户将不必费心使用用户sizeof(member_t)
或sizeof(*member_t)
或sizeof(struct MEMBER_T)
。
除了typedef struct MEMBER_T* member_t
之外,还要在标头中定义函数membet_t* create_member_array(int)
。
在您的.c文件中实现
member_t* create_member_array(int length) {
member_t* arr = (member_t*) malloc(length * sizeof(member_t));
if(arr) {
int i = 0;
for(; i < length; i++) {
arr[i] = (member_t) malloc(sizeof(struct MEMBER_T));
if(arr[i]) {
arr[i]->member_id = 0;
arr[i]->name = NULL;
}
}
}
return arr;
}
您在结构体char name;
的声明char name;
与语句members[0]->name = "test"
组合的语句不正确。 您声明一个字符并尝试向其分配一个字符串,女巫本身是不正确的。 它应该是char* name
,在尝试使用strcpy()
将字符串复制到ist之前,您应先分配内存
member[0]->name = malloc((strlen("test") + 1) * sizeof(char)); // 1 more the terminating '\0' !
strcpy(member[0]->name, "test");
另类:
member[0]->name = strdup("test");
您需要确保释放/释放它的内存分配量很多。 您将必须创建另一个函数来释放所有这些内存
void free_member_array(member_t* members, int length) {
for(int i = 0; i < length; i++) {
if(members[i]->name) {
free(members[i]->name);
}
free(members[i]);
}
free(members);
}
使用sizeof(*member_t)
或sizeof(struct MEMBER_T)
如果您将struct定义隐藏在.c文件中,则不能使用sizeof在该模块之外查找其类型。
解决方案是要么在模块中公开一个进行分配的功能(也许也进行初始化),要么提供一个给出大小的功能。
或者,当然也可以将定义移回头文件。
如果要分配10个类型为member_t的结构,则必须分配10倍的大小,在代码中,您只分配10倍于指针的大小:
/* member.h */
typedef struct MEMBER_T *member_t; // here your typedef member_t is on a pointer
第二个问题是,如果要在结构中使用char *,则必须分配要放入其中的内容,如果struct member_t的成员名称是char ,则用“ test” 填充此char “您必须分配足够的空间。
/* member.h */
typedef struct MEMBER_T member_t;
/*file.c*/
member_t *members;
members = malloc(10 * (sizeof(member_t)));
// here i allocate 10 structs of type member_t
members[0].name = strdup("test");
// here i allocate enough place for "test" by
// using the strdup function who returns an allocate
// element.
如果您的printf(“%s \\ n”,成员[0] .name); 您将收到“测试\\ n”。
就像我和其他人所说的, sizeof(member_t)
与sizeof(struct MEMBER_T)
。 那是你的问题之一。
您在注释中解释的另一个是您希望name
成员是字符串。 这里的问题是您将成员声明为单个字符。 可以将其声明为指向字符的指针( char *name
),也可以声明为数组( char name[MAX_NAME_LENGTH]
,其中MAX_NAME_LENGTH
适合您)。 在第一种情况下,我建议您使用strdup
复制字符串,但是切记在完成后free
它们。 在最后一种情况下,请使用strncpy
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.