【问题标题】:Initializing a dynamically allocated array with a specific value in C在 C 中使用特定值初始化动态分配的数组
【发布时间】: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


【解决方案1】:

那么,既然我想把我的数组的所有值都初始化为APPLE,那么使用memset()是不是很有用呢?

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

我如何确保编译器能够理解我的数组中的值是fruit 变量而不仅仅是整数?

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


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

【讨论】:

  • 只是一个问题。所以假设我不使用memset(),现在我的数组在任何地方都初始化为0,我如何让编译器理解每个0都是color而不是int?我必须进行某种类型转换吗?
  • 枚举使用整数类型表示,所有位0表示0在任何整数类型中,所以它是一样的。
猜你喜欢
  • 2020-05-04
  • 1970-01-01
  • 2014-10-29
  • 2011-12-23
  • 2021-09-22
  • 2017-11-06
  • 2011-04-15
  • 1970-01-01
相关资源
最近更新 更多