我是编程C的初学者,在创建动态结构数组时需要帮助获取和设置值。
我有这个结构例如:
struct opt{
int size;
Element* elements;
CopyFunction copyElement;
};
typedef struct opt * Popt;
我想使用动态分配并使用malloc
为5个struct opt
类型的结构分配内存;我用过这一行:
Popt opt_t = (Popt)malloc(5*sizeof(struct opt));
我想在这些结构中获取和设置值。如果我像OOP一样思考,我想得到这样的值:
opt_t [2] .size,opt_t [3] .elements,opt_t [3] .copyElement
我怎么能用C做呢?我尝试使用以下行并且看起来很糟糕(我的记忆充满了垃圾)。
*((&(opt_t->size)+(2*sizeof(struct opt))))
*((&(opt_t->elements)+(3*sizeof(struct opt))))
*((&(opt_t->copyElement)+(3*sizeof(struct opt))))
答案 0 :(得分:2)
如果我像OOP一样考虑这个问题,我想得到这些价值观:
opt_t[2].size, opt_t[3].elements, opt_t[3].copyElement
如何使用C?
喜欢' OOP':
opt_t[2].size
opt_t[3].elements
opt_t[3].copyElement
你尝试过吗?什么地方出了错?您不需要按照正常C中对象的大小来缩放指针,因此像*((&(opt_t->size)+(2*sizeof(struct opt))))
这样的符号完全朝错误的方向发展。可以剖析它们正在做的事情,但它不是预期的,并通过访问分配范围之外的内存来调用未定义的行为。 (如果你真的想知道他们做了什么,请发表评论并进行阐述,但你应该在评论中解释他们的想法。)
如果您愿意,可以使用:
(*(opt_t + 3)).copyElement
索引指针,取消引用它,然后应用成员访问权限。但是使用opt_t[3].copyElement
代替它更简单。
请注意,_t
后缀最常用于表示类型名称(从C标准中考虑size_t
,uint8_t
,wchar_t
等,还有更多来自POSIX)。最好不要在变量上使用后缀;它有可能混淆阅读代码的人。它实际上并不是错的;它只是向那些看过很多C代码的人发错了信息。
另请参阅Is it a good idea to typedef pointers,简明扼要的答案是'否' (或者通常没有')。正如对这个问题的回答所证明的那样,这种typedef会导致混淆。
在suggested中,问题中的内存分配可能存在一些混淆。既然它说:
我想使用动态分配并使用
malloc
来分配5个struct opt
类型结构的内存...
并迅速着手展示一种可接受的做法,尽管有cast许多人鄙视但我并不担心我附近的任何地方似乎让其他人感到不安,我没有必要进一步评论内存分配。我悄悄地假设当代码完成分配的空间时会有一个调用free(opt_t)
或等效的地方 - 并且如果为elements
成员分配了空间,那么该空间将首先被释放。 / p>
答案 1 :(得分:0)
你需要一个双指针:
Popt *opt_t;
//do error checking of the return value of malloc
opt_t = malloc(5 * sizeof(opt_t)); //5 pointers
for(i = 0; i < 5; i++){
opt_t[i] = malloc(sizeof(opt)); //each struct
}
最终免费记忆:
for(i = 0; i < 5; i++){
free(opt_t[i]);
}
free(opt_t);