为不同数据类型的结构体提供一个统一的初始化函数

编程语言 2026-07-10
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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章