1

我已经对 stackoverflow 上的结构分配内存进行了一些研究,而我发现的答案对我不起作用。话虽如此,这是我的问题和问题。在大多数情况下,他们中的大多数人的代码与我目前拥有的代码相同。尽管我的编译器给了我一个错误。

问题:我想为 Struct(结构数组)而不是 Pointer(指向结构的指针)分配内存。下面是我的结构的定义。

 #define INIT_MEMO_SIZE

typedef struct Memo
{
   struct HugeInteger *F; 
   int length; 

}Memo; 

所需的解决方案:在备忘录结构中,我想动态分配一个 INIT_MEMO_SIZE 数量的巨大整数结构的数组

尝试的解决方案:在“malloc”的右下方我收到一条错误消息,指出“错误:'void *' 类型的实体不能用于初始化'HugeInteger *'类型的实体,这用红色强调了关键字“malloc”。编译器正在使用的是 Microsoft Visual Studio 2012

// Creates and initializes a Memo Struct
Memo *createMemo(void)
{ 
    HugeInteger *ptr = malloc(sizeof(HugeInteger) * INIT_MEMO_SIZE); 

    if(ptr == NULL)
        return NULL; 

} // End of *createMemo

问题:我做错了什么或者分配结构数组的正确方法是什么?

4

2 回答 2

2

malloc 返回一个 void*。您需要转换返回的值。

 HugeInteger *ptr = (HugeInteger*)malloc(sizeof(HugeInteger) * INIT_MEMO_SIZE); 
于 2013-06-09T16:43:16.013 回答
0

您的评论说此代码“创建并初始化一个备忘录结构”但是,我看不到它创建或初始化一个Memo struct. 事实上,该函数甚至不返回这样的结构(除非内存分配失败)。也许你想要这样的东西:

Memo *createMemo(void)
{ 
    Memo *memo = malloc(sizeof(Memo));

    if(memo == NULL)
        return NULL;

    memo->F = malloc(sizeof(struct HugeInteger) * INIT_MEMO_SIZE); 

    if(memo->F == NULL)
    { // Oops, memory allocation failed.
        free(memo);
        return NULL;
    }

    // other initialization here -- perhaps set memo->length 
    // to some sensible value
    memo->length = INIT_MEMO_SIZE;

    // and return the new memo
    return memo;
} // End of *createMemo

一般来说,您不需要malloc在 C 中对操作的结果进行类型转换。确实,这样做通常会导致难以诊断的微妙问题。因此,坦率地说,如果编译器在抱怨,这表明您正在编译为 C++。

但是,您说不强制转换会导致malloc带有红色下划线并带有某种与之相关的“错误”。这向我表明您所看到的不是编译器错误,而是来自过度热心的编辑器的警告(通过 Intellisense,可能与 VS2012 实现的 SDL 检查相结合)试图先发制人地警告您它认为是什么在你编译之前发出问题。

于 2013-06-09T18:12:10.250 回答