C语言中的struct forward声明

时间:2011-12-30 10:45:28

标签: c

我想隐藏c模块中的指定结构,因此struct声明位于* .c文件中,而header包含一个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创建一个对象?

提前致谢!

5 个答案:

答案 0 :(得分:2)

您正在分配一个数组。你仍然需要分配它的每个元素。

如果你想在.c文件中隐藏结构,那么封装它的创建也是一个好主意。因此,您的结构用户不会打扰是否使用sizeof(member_t)sizeof(*member_t)sizeof(struct MEMBER_T)

除了membet_t* create_member_array(int)之外,

在您的标题中定义一个函数typedef struct MEMBER_T* member_t

在你的.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;中的声明与声明members[0]->name = "test"结合使用是不正确的。你声明一个字符并试着给它设一个字符串,这本身就不正确。它应该是char* name并且您在尝试使用strcpy()

将字符串复制到ist之前分配mememory
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);
}

答案 1 :(得分:1)

使用sizeof(*member_t)sizeof(struct MEMBER_T)

答案 2 :(得分:1)

如果您将结构定义隐藏在.c文件中,则不能使用sizeof在该模块之外查找其类型。

解决方案是在模块中公开执行分配的函数(也可能是初始化),或提供给出大小的函数。

当然,要将定义移回头文件。

答案 3 :(得分:1)

如果你想分配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);你将收到“test \ n”。

答案 4 :(得分:0)

像我和其他人所说,sizeof(member_t)sizeof(struct MEMBER_T)不同。这是你的一个问题。

您在评论中解释的另一个是您希望name成员成为字符串。这里的问题是您将该成员声明为单个字符。将其声明为指向字符(char *name)或数组(char name[MAX_NAME_LENGTH],指向适合您的MAX_NAME_LENGTH的指针)。在第一种情况下,我建议您使用strdup复制字符串,但在完成后请记住free。在最后一种情况下,请使用strncpy