【发布时间】:2018-04-03 16:13:57
【问题描述】:
所以,我已经为一个数组动态分配了内存,我想将它的所有值初始化为一个特定的值(它是一个枚举的元素)。
这是我到目前为止所做的:
typedef enum{APPLE, BANANA, ORANGE} fruit;
typedef struct Smoothie Smoothie;
struct Smoothie {
fruit* tab;
};
这是迄今为止我定义的所有结构。现在,要创建“冰沙”,我执行以下操作:
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:我知道我可以使用循环来初始化我的数组,但这样做的重点是实际上避免使用循环。
【问题讨论】:
-
memset仅在sizeof(fruit) == 1时才有效,这根本无法保证。 -
Smoothie init(size_t n)嗯...你确定这是你想要的吗?我希望Smoothie* init(size_t n)和return juice; -
"
Smoothie init(size_t n)嗯...你确定这是你想要的吗?我希望Smoothie* init(size_t n)和只是return juice,?“是的,我确定。我想要组合,而不是使用函数后指向组合的指针。 (虽然我可以按照你的方式做,但这并不重要)。 -
如果
juice是Smoothie类型的局部变量而不是Smoothie *类型,Smoothie init(size_t n)会很好。当前代码泄漏内存。换句话说,将Smoothie *juice = malloc(sizeof(Smoothie));替换为Smoothie juice;,将juice->tab替换为juice.tab,将return *juice;替换为return juice;。 -
@Skyris 可以返回一个结构体。它很可能比调用
malloc便宜。当你mallocSmoothie的数组时,你返回一个指针,但由于你只有一个,所以最好只返回它。
标签: c arrays dynamic-allocation