我一直在做一些 C 專案,想知道我是否創建了一個自定義結構,例如,Student定義一個自定義結構型別的變數,并使用 malloc 為其分配記憶體,它是否也為變數的屬性分別分配記憶體還是它們都保存在同一個空間中?如果是,如果我為每個屬性分別使用 malloc 分配記憶體會有什么不同嗎?
例如:
typedef struct {
unsigned int ID;
char *first_name;
char *last_name;
int num_grades;
float *grades;
unsigned short int days_absent;
char *memo;
} Student;
int main() {
// Declare students array
Student *students = NULL;
int students_size = 0;
// Allocate memory for students array
students = (Student *) malloc(sizeof(Student));
return 0;
}
uj5u.com熱心網友回復:
這為結構分配了足夠的記憶體,其中包括足夠的記憶體用于ID,first_name等以及所有填充要求。
請注意,雖然它為指標分配記憶體first_name,但它沒有分配緩沖區來保存名稱。只是指標。如果您想要存盤名稱的記憶體,則需要分配它。
如果結構有一個char first_name[40];欄位,那將是另一回事。在這種情況下,結構將包含 40 的陣列char而不是指標。所以它會為一個 40 的陣列分配足夠的空間,char而不是為一個指標分配足夠的空間。
uj5u.com熱心網友回復:
不,它沒有。它為您想要的 s 數量分配未初始化的記憶體char- 這通常是基于sizeofs 的計算。
如果您希望它分配記憶體來存盤您struct的指標指向的值,則必須在為struct.
當你free這樣一個struct.
例子:
typedef struct {
char *data;
} foo;
foo *foo_create() {
foo *retval = malloc(sizeof *retval ); // try allocation
if(retval == NULL) return NULL; // check that it worked
retval->data = malloc(10) ; // allocate something for a member
if(retval->data == NULL) { // check that it worked
free(retval); // oh, it didn't, free what you allocated
return NULL; // and return something to indicate failure
}
return retval; // all successful
}
void foo_free(foo *elem) {
if(elem != NULL) { // just a precaution
free(elem->data); // free the member's memory
free(elem); // then the memory for the object
}
}
uj5u.com熱心網友回復:
它是否也分別為變數的屬性分配記憶體
No. 分配給 之后students,分配給students->first_name,students->last_name等等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/418542.html
標籤:
下一篇:是否可以釋放()或縮短字符陣列?
