簡體   English   中英

C-函數內結構數組的多個malloc

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM