在 C 中使用特定值初始化动态分配的数组

Initializing a dynamically allocated array with a specific value in C

所以,我已经为一个数组动态分配了内存,我想将它的所有值初始化为一个特定值(这是一个枚举的元素)。

这是我到目前为止所做的:

    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:我知道我可以使用循环来初始化我的数组,但这样做的全部意义在于实际上避免使用循环。

So, since I want to initialize all the values of my array to APPLE, is it very useful to use memset()?

没有。 memset()byte 值填充一个区域。 enum 的大小可以变化,但通常是 int,它大于一个字节。你会用一些未定义的东西填满你的记忆。 (当然,值为 0 的枚举成员除外)

How can I be sure that the compiler will understand that the values in my array are fruit variables and not just integers?

您已经通过声明类型 fruit 做到了这一点。但这并没有多大帮助,因为 C 中整数和枚举值之间的转换是隐式的。


总而言之,如果需要将内存初始化为0以外的枚举值,则需要编写一个循环。如果你确实想要 0 对应的值,calloc() 就可以了,没关系,因为 0 仍然是 0 :)