为不同数据类型的结构体提供一个统一的初始化函数
struct string_t {
size_t size;
size_t count;
char *array;
};
struct int8_array_t {
size_t size;
size_t count;
int8_t *array;
};
/* and so on... a struct for each data type */
/* accepts an enum of the standard data types (INT8_T, FLOAT, CHAR, etc.) */
void *init_array_t(enum data_type type);
我所采用的结构是将每个结构体定义在它自己的头文件中,并附带一些相关函数。现在,我不想为每种数据类型实现一个初始化函数(init_string_t、init_int8_array_t等),因为这真的很麻烦。最初,我把初始化函数放在它自己的文件里,简单的实现如下:
void *init_array_t(enum data_type type) {
switch(type) {
case CHAR:
struct string_t *str_arr;
/* initialising the pointer along with the struct members */
return (void*)str_arr;
break;
/* rinse and repeat, only changing the type */
}
}
我这样实现,是为了模拟我理解中的malloc的工作方式。也就是说,它返回一个void*,你所做的只是将其转换为所需的类型。
然而,由于我把结构体的定义与init_array函数分离,函数就无法知道结构体的成员,更重要的是malloc也无法知道为该结构体分配内存所需的大小。
这让我开始想知道malloc是如何实现的。
解决方案
我的理论是,因为它只接收字节数作为参数,所以并不需要知道一个结构体占用多少字节——因为sizeof运算符会为它计算大小。
这是正确的。
函数 malloc 不会以任何方式初始化已分配的内存块,因此它只需要知道要分配的字节总数。它不关心你希望用这块内存块存放哪种结构体。
The function calloc,另一方面,确实会初始化已分配的内存块。然而,它只是把分配的内存块中的所有位都设为零。因此,这个函数也不关心你要用这块内存来存放哪种结构。
现在,我不想为每种数据类型实现一个初始化函数(init_string_t、init_int8_array_t等),因为我觉得这太麻烦了。
我相信这也是大多数C 程序员会这样做的。尝试把初始化函数合并为一个适用于所有结构的通用函数,只有在所有结构的初始化在某种程度上非常相似时才有意义。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。