我已经完成了一些关于为stackoverflow上的结构分配内存的研究,我找到的答案对我不起作用。话虽如此,这是我的问题和问题。在大多数情况下,他们中的大多数拥有我目前拥有的相同代码。虽然我的编译器给了我一个错误。
问题:我想为Struct(结构数组)而不是指针(指向结构的指针)分配内存。以下是我的结构的定义。
#define INIT_MEMO_SIZE
typedef struct Memo
{
struct HugeInteger *F;
int length;
}Memo;
必需的解决方案:在memo struct中我想动态分配一个INIT_MEMO_SIZE数组的巨大整数结构
尝试解决方案:右下角“malloc”我收到一条错误,指出“错误:类型为'void *'的实体不能用于初始化'HugeInteger *'类型的实体,这会强调关键字”malloc“in red。正在使用的编译器是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
问题:我做错了什么或分配结构数组的正确方法是什么?
答案 0 :(得分:2)
malloc返回void *。您需要转换返回的值。
HugeInteger *ptr = (HugeInteger*)malloc(sizeof(HugeInteger) * INIT_MEMO_SIZE);
答案 1 :(得分:0)
您的评论说这段代码“创建并初始化了一个Memo结构”但是,我看不到创建或初始化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
一般来说,您不需要在C中对malloc
操作的结果进行类型转换。实际上,这样做通常会导致难以诊断的细微问题。所以,坦率地说,如果编译器抱怨,这表明你正在编译为C ++。
然而,你说不会将malloc
的结果显示为红色下划线并且与之相关的某种“错误”。这告诉我你所看到的不是编译器错误,而是来自过度热心的编辑器的警告(通过Intellisense,可能与VS2012实施的SDL检查相结合)试图预先警告你关于你甚至在编译之前认为是什么问题。