我有一个关于为结构分配内存的理论问题。请考虑以下主要功能代码:
我有以下结构:
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文件并且我不知道行/条目的数量) 。所以我需要为第二个扩展struct-pointer 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]
访问第二个结构? index [1]是否存储结构的实际地址,还是仅计算结构的大小并从结构指针can_id_list
的偏移量开始跳转到此地址( - > {{1 }})?
嗯,我真正的问题是,我需要在函数内部执行此操作,因此我需要将结构的指针传递给函数。但是我不知道如何做到这一点,因为can_id_list+<2*sizeof(CAN_ID_ENTRY)
已经是一个指针......并且主要方法中的更改也必须是可见的(这就是我需要使用指针的原因) )。
上述功能就是这个:
can_id_list
但参数int load_can_id_list(char *filename, CAN_ID_ENTRY **can_id_list);
是否正确?我如何将struct-array传递给这个函数?我怎么能在里面修改它?
任何帮助都会很棒!
编辑:转换malloc返回 - Visual Studio强迫我这样做! (因为它是我认为的C ++项目)
答案 0 :(得分:2)
正如评论已经说过,你的困惑的来源是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是否正确?我怎么样? 将struct-array传递给这个函数?我怎么能修改它 内部??
如果要在另一个函数中扩大数组的大小,则需要传递CAN_ID_ENTRY*** pr
,以便根据需要设置*ptr = realloc(...)
。 Realloc可能会在不同的地址为您提供新的内存块,因此您不能简单地传入CAN_ID_ENTRY** ptr
然后执行realloc(ptr)
。见https://www.tutorialspoint.com/c_standard_library/c_function_realloc.htm