繁体   English   中英

C中的结构前向声明

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM