C - 函数

时间:2018-02-17 20:08:08

标签: c pointers struct malloc

我有一个关于为结构分配内存的理论问题。请考虑以下主要功能代码:

我有以下结构:

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 ++项目)

1 个答案:

答案 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