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