簡體   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