所以,我已经为一个数组动态分配了内存,我希望将它的所有值初始化为一个特定的值(这是枚举的一个元素)。
这是我到目前为止所做的事情:
typedef enum{APPLE, BANANA, ORANGE} fruit;
typedef struct Smoothie Smoothie;
struct Smoothie {
fruit* tab;
};
这是我到目前为止所定义的所有结构。现在,要创建" Smoothie",我会执行以下操作:
Smoothie init(size_t n) {
Smoothie* juice = malloc(sizeof(Smoothie));
if (juice == NULL) {
//error msg in case the allocation has failed.
}
juice->tab = calloc(n, sizeof(fruit));
if (juice->tab == NULL) {
//error msg in case the allocation has failed.
}
memset(juice->tab, APPLE, n*sizeof(fruit));
return *juice;
}
我的问题如下。从我在互联网上阅读的内容来看,我知道calloc()
已经将数组的所有值初始化为0.在枚举中,所有元素都有一个数值(默认情况下,我的枚举具有以下值:Apple = 0 BANANA = 1 ORANGE = 2
)。所以,既然我想将我的数组的所有值初始化为APPLE
,那么使用memset()
是否非常有用?
换句话说,如果我不使用memset()
会怎样?我怎么能确定编译器会理解我的数组中的值是fruit
变量而不仅仅是整数?
PS:我知道我可以使用一个循环来启动我的数组,但是这一点的全部意义是实际上避免使用循环。
答案 0 :(得分:4)
所以,既然我想将我的数组的所有值初始化为
APPLE
,那么使用memset()
是否非常有用?
没有。 memset()
使用 byte 值填充区域。 enum
的大小可能会有所不同,但通常为int
,大于一个字节。你将用未定义的东西填满你的记忆。 (当然,除了值为0
的枚举成员)
我怎样才能确定编译器会理解我的数组中的值是
fruit
变量而不仅仅是整数?
您已经通过声明fruit
类型来做到这一点。但它没有多大帮助,因为C中整数和枚举值之间的转换是隐含的。
总而言之,如果您需要将内存初始化为0
以外的枚举值,则需要编写循环。如果您确实希望与[{1}}相对应的值,0
会这样做,那么calloc()
仍然是0
并不重要:)