[英]C - Multiple malloc's for a struct-array inside a function
我有一個關於為結構分配內存的理論問題。 在主要功能中考慮以下代碼:
我有以下結構:
typedef struct {
char *descr = NULL;
DWORD id = 0x00FFFF00;
int start_byte = 0;
int end_byte = 0;
double conversion_factor = 0.0;
} CAN_ID_ENTRY;
我想要一個該結構的數組,所以我要分配一個指向第一個結構的指針:
can_id_list = (CAN_ID_ENTRY **)malloc(sizeof(CAN_ID_ENTRY));
然后,我為第一個struct can_id_list[0]
分配內存:
can_id_list[0] = (CAN_ID_ENTRY *)malloc(sizeof(CAN_ID_ENTRY));
現在的問題是,我不知道我需要多少這些結構(因為我正在讀取CSV文件,並且我不知道行數/條目數)。 因此,我需要擴大結構指針can_id_list
的第二個:
can_id_list = (CAN_ID_ENTRY **)malloc(sizeof(CAN_ID_ENTRY));
然后我分配第二個結構can_id_list[1]
:
can_id_list[1] = (CAN_ID_ENTRY *)malloc(sizeof(CAN_ID_ENTRY));
can_id_list[1]->id = 6;
顯然,這可行。 但為什么? 我的意思是:通常,malloc在內存的一個塊中分配內存(無間隙)。 但是,如果在我為下一個結構分配內存之前完成了另一個malloc,則第一個結構和第二個結構之間將存在間隙。 那么,為什么我可以通過can_id_list[1]
訪問第二個結構? 索引[1]是存儲結構的實際地址,還是只是計算結構的大小並從結構指針can_id_list
(-> can_id_list+<2*sizeof(CAN_ID_ENTRY)
的偏移量開始,跳轉到該地址)?
好吧,我真正的問題是,我需要在函數內部執行此操作,因此需要將結構的指針傳遞給函數。 但是我不知道該怎么做,因為can_id_list
已經是一個指針...並且更改也必須在main方法中可見(這就是我需要使用指針的原因)。
提到的功能就是這個:
int load_can_id_list(char *filename, CAN_ID_ENTRY **can_id_list);
但是參數CAN_ID_ENTRY **can_id_list
是否正確? 以及如何將結構數組傳遞給此函數? 我怎么在里面修改它呢?
任何幫助將是巨大的!
編輯:強制轉換malloc返回-Visual Studio強制我這樣做! (因為我認為這是一個C ++項目)
正如評論已經說過的那樣,您困惑的根源是can_id_list = (CAN_ID_ENTRY **)malloc(sizeof(CAN_ID_ENTRY));
分配錯誤的內存量。 它可能為您提供了一些存儲指針的空間,而不僅僅是一個。 應該是can_id_list = (CAN_ID_ENTRY **)malloc(sizeof(CAN_ID_ENTRY*));
。
最后回答這個問題,
但是參數CAN_ID_ENTRY ** can_id_list是否正確? 以及如何將結構數組傳遞給此函數? 我怎么在里面修改它呢?
如果要在另一個函數中擴大數組的大小,則需要傳遞CAN_ID_ENTRY*** pr
以便可以根據需要在內部設置*ptr = realloc(...)
。 Realloc可能會在不同的地址為您提供新的內存塊,因此您不能簡單地傳遞CAN_ID_ENTRY** ptr
然后執行realloc(ptr)
。 參見https://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.