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

时间:2018-04-03 16:13:58

标签: c arrays dynamic-allocation

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

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

    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:我知道我可以使用一个循环来启动我的数组,但是这一点的全部意义是实际上避免使用循环。

1 个答案:

答案 0 :(得分:4)

  

所以,既然我想将我的数组的所有值初始化为APPLE,那么使用memset()是否非常有用?

没有。 memset()使用 byte 值填充区域。 enum的大小可能会有所不同,但通常为int,大于一个字节。你将用未定义的东西填满你的记忆。 (当然,除了值为0的枚举成员)

  

我怎样才能确定编译器会理解我的数组中的值是fruit变量而不仅仅是整数?

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

总而言之,如果您需要将内存初始化为0以外的枚举值,则需要编写循环。如果您确实希望与[{1}}相对应的值,0会这样做,那么calloc()仍然是0并不重要:)